如何将Advantage API示例C代码转换为Delphi

时间:2013-12-06 19:06:54

标签: delphi advantage-database-server

我正在尝试从Advantage Database文档中将示例代码转换为Delphi,但似乎无法使变量声明正确,从varType开始,也无法找出MAX_STR_LEN(常量,函数,其他?)。

以下是示例中的代码:

 UNSIGNED32 DoDates( void )
 {  
      ADSHANDLE hTable;
      UNSIGNED16 usLength;
      UNSIGNED8 aucDOB[MAX_STR_LEN+1];
      ...
      usLength = MAX_STR_LEN+1
      AdsGetDate( hTable, "DOB", aucDOB, &usLength );
      ... 
 }

我尝试过的Delphi代码是:

 procedure TForm1.fixARInvoiceEntryHeaderDates;
 var
      tableHandle:ADSHandle;
      aucDOB:pansichar;
      usLength:punsigned16;

 begin
      ...
      AdsGetDate(
      tableHandle,
      'inv_date',
      aucDOB,
      &usLength);
      ...
 end;

1 个答案:

答案 0 :(得分:5)

MAX_STR_LEN在Advantage Client Engine Sample Code帮助主题中定义为255,位于您为DoDates示例引用的页面的最顶部。它们以这种方式声明,因为它们在示例代码中使用它,因此它足够大,可用于返回各种类型的数据(字符串,日期和其他类型的字符串内容)。

如果您只是专门用于检索日期的缓冲区,则可以使用更小的缓冲区大小,因为ADS日期类型或格式都不会接近那么长。 (我在下面的示例中使用了49个单字节字符(字节)的缓冲区大小,这仍然是它所需大小的至少2倍。)

这样的事情应该有效:

// Reduced because of intended use. See text above, 2nd paragraph.
// If you're using this buffer for things other than dates,
// change to 255 as original code did.

const
  MAX_STR_LEN = 49;  

type
  TCharDateBuffer = array[0..MAX_STR_LEN + 1] of AnsiChar;

var
  DateBuffer: TCharDateBuffer;
  BuffSize: UNSIGNED16;       // From Ace.pas
  tableHandle: ADSHandle;     // From Ace.pas
begin
  // Your code to open the table and get the handle

  BuffSize := MAX_STR_LEN;
  AdsGetDate(tableHandle, 'DOB', DateBuffer, @BuffSize);
end;

但是,如果您使用他们的TDataSet descendant组件(例如,TAdsTableTAdsQuery),Delphi会更容易。然后,您可以使用普通TField属性:

// Retrieve DOB as string
StrDOB := MyAdsTable.FieldByName('DOB').AsString;

// Get DOB as TDateTime
DOB := MyAdsTable.FieldByName('DOB').AsDateTime;

// Set date field to today
MyAdsTable.FieldByName('CHANGED').AsDateTime := Date;

可以从Product Downloads页面获取“优势TDataSet”组件;单击您正在使用的Advantage版本的链接,您将找到该页面上组件的链接。