我正在尝试从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;
答案 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
组件(例如,TAdsTable
或TAdsQuery
),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版本的链接,您将找到该页面上组件的链接。