E2029 '(' 预期但 'THEN' 找到

E2029 '(' expected but 'THEN' found

提问人:Rafael Sampaio Moura 提问时间:5/4/2023 最后编辑:Rafael Sampaio Moura 更新时间:5/4/2023 访问量:156

问:

因此,我正在尝试在 Delphi 10.4 中编写一个函数,该函数从 SQL 表中取出一个 JSON 文件,并在网格上显示其中的所有项目。

其中之一是日期格式,导致应用程序崩溃,所以我自然而然地尝试弄清楚它是哪个,以便我可以正确格式化它。

但是,我用来尝试查找它的方法一直显示上述错误:

procedure InjectJSONIntoTable(Query: TFDQuery; MemTable: TFDMemTable; Edit: TEdit);
    var
        jsonString: string;
        jsonArr: TJSONArray;
        jsonItem: TJSONObject;
        jsonValue: TJSONValue;
        i: Integer;
        j: Integer;
        dummyString: string;
    begin
        // applies the sql command
        Query.SQL.Text := Edit.Text;
        Query.Open;
        // transforms the sql return back into JSON
        jsonString := Query.FieldByName('jdoc').AsString;
        jsonArr := TJSonObject.ParseJSONValue(jsonString) as TJSONArray;
        // preps the table to receive the data
        MemTable.Close;
        MemTable.CreateDataSet;
        MemTable.Open;
        MemTable.Insert;
        // appends the data to the table;
        for i := 0 to jsonArr.Count -1 do begin
          jsonItem := jsonArr.Items[i] as TJSonObject;
          for j := 0 to MemTable.Fields.Count - 1 do begin
            MemTable.Edit;
            jsonValue := jsonItem.GetValue(MemTable.FieldDefs[j].Name);
            if jsonValue.ClassType = TDateTime then ShowMessage('tralala');
                                                               ^ '(' expected but 'THEN' found
            MemTable.Fields[j].AsString
              := jsonItem.GetValue(MemTable.FieldDefs[j].Name).Value;
          end;
        end;


        MemTable.Post;
        // shows data on the table
    end;

也许我是盲人,但老实说,我无法弄清楚错误来自哪里。

我尝试了很多东西,切换了元素的顺序,但是错误要么持续存在,要么出现一堆新错误。

if-statement delphi 语法错误 pascal

评论


答:

3赞 JP Ritchey 5/4/2023 #1

TDateTime 不是一个类。它基本上是 Double 类型的别名。

错误是因为唯一有意义的事情是执行类型转换,例如 TDateTime(someVariable)。

我相信你想做的是这样的

var LDateTimeVar: TDateTime;
if jsonValue.TryGetValue<TDateTime>(LDateTimeVar) then ShowMessage('tralala');
2赞 Remy Lebeau 5/4/2023 #2

该方法返回一个 ,它只能指向 -派生类型。 不是派生自 的类,因此您不能使用 (或 ,如@Dúthomhas建议的那样)。TJSONValue.ClassType()TClassTObjectTDateTimeTObjectClassType = TDateTimeClassType is TDateTime

JSON 没有日期/时间值的概念,因此没有为 实现类。日期/时间只是一个到 JSON。TJSON...TDateTimestring

@JPRitchey如前所述,您可以使用 TJSONValue.TryGetValue() 方法将 的值转换为 ,检查转换是成功还是失败。请注意,只有在以下任一情况下才会成功:jsonValueTDateTimeTryGetValue<TDateTime>()

  • jsonValue是一个对象,字符串值以 ISO-8601 格式表示(因为转换使用 DateUtils.ISO8601ToDate())。TJSONString

  • jsonValue是一个对象。转换将设置 to (December 31, 1899) 或 (December 30, 1899),具体取决于布尔值。TJSONBoolTDateTime1.00.0

否则,将返回 .TryGetValue<TDateTime>()False

如果这不符合您的需求,则必须自己手动检查 JSON 值,例如:

var dtValue: TDateTime;

jsonValue := jsonItem.GetValue(MemTable.FieldDefs[j].Name);

// use whatever makes sense for your particular use-case...
if TryStrToDateTime(jsonValue.Value, dtValue) then
  ShowMessage('tralala');

MemTable.Fields[j].AsString := jsonValue.Value;

评论

0赞 Rafael Sampaio Moura 5/4/2023
花了一些时间,但这奏效了,非常感谢!