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

4

我试图将Advantage数据库文档中的示例代码翻译为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;

2
顺便提一下,您是否知道Advantage有一组Delphi组件,它们是TDataSet的子类?这使得您可以使用普通的表格或查询操作,并使用Table.FieldByName('DOB').AsDateTime访问字段。它们可以从Advantage网站免费下载。 - Ken White
是的,谢谢。我只是为了修复一个损坏的日期值(TAdsTable函数导致5095错误)而这样做。 - Bill Seven
1个回答

5

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

如果您只打算使用缓冲区来检索日期,那么您可以使用更小的缓冲区大小,因为ADS日期类型或格式都不会超过那么长。(在下面的示例中,我使用了一个大小为49个单字节字符(字节)的缓冲区,仍然至少是需要的两倍大小。)

像这样就可以:

// 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;

如果你使用Delphi的TDataSet派生组件(例如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;

可以从产品下载页面获取Advantage TDataSet组件;点击您正在使用的Advantage版本的链接,您将在该版本的页面上找到组件的链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接