Page 1 of 1

Access Viollation using memtable and calc fields [zeos8+lazarus 3.2]

Posted: 02.05.2024, 21:33
by hamacker
Hi ALL,

I am using zeos8 (git pull from this date) + lazarus 3.2.
So, When I create memtable (Lista_Atual) with calc field, I canĀ“t do memtable.[append/edit/...] because will trigger access viollation, if I remark as comment field qtde_solicitada_com (calculated field) no error will be displayed.

Code: Select all

    try
      with Lista_Atual.FieldDefs do
      begin
        Clear;
        Add('id_processo'           , ftLargeint,   0, False);
        Add('criacao_grupo'         , ftString,   32, False);
        Add('tag_name'              , ftString,   50, False);
        Add('coditem_almox'         , ftString,   50, False);
        Add('necessidade_dt'        , ftDateTime,  0, False);
        Add('qtde_solicitada'       , ftFloat,    0, False);
        Add('unidade'               , ftString,   6, False);
        Add('qtde_solicitada_com'   , ftString,    12, false); // calc field
        Add('descricao'             , ftString, 250, False);
        Add('observacao'            , ftString, 250, False);
        Add('reserva_sn'            , ftBoolean ,  0, False);
      end;
      Lista_Atual.IndexFieldNames:='id_processo;coditem_almox';
      Lista_Atual.FilterOptions:=[foCaseInsensitive];
      if (not Lista_Atual.Active) then
        Lista_Atual.Active:=true;
      Lista_Atual.FieldByName('coditem_almox').Visible:=false;
      Lista_Atual.FieldbyName('qtde_solicitada_com').FieldKind:=fkCalculated;
    except
    on e:exception do
       begin
         Result:=e.Message;
       end;
    end;
    except
    on e:exception do
       begin
         Result:=e.Message;
       end;
    end;
  end;
  // now, I try to append
      lista_atual.Append;  // Access Viollation Here
      lista_atual.FieldbyName('id_processo').AsLargeInt:=Id_Processo;
      lista_atual.FieldbyName('criacao_grupo').AsString:=edtCRIACAO_GRUPO.Text;
      lista_atual.FieldbyName('tag_name').AsString:=edtTAG_NAME.Text;
      lista_atual.FieldbyName('coditem_almox').AsString:=qPesquisaAlmox.FieldbyName('coditem_almox').AsString;
      lista_atual.FieldbyName('necessidade_dt').AsDateTime:=edtNECESSIDADE_DT.Date;
      lista_atual.FieldbyName('qtde_solicitada').AsFloat:=nQuantidade;
      lista_atual.FieldbyName('unidade').AsString:=qPesquisaAlmox.FieldbyName('unidade').AsString;
      lista_atual.FieldbyName('descricao').AsString:=LeftStr(qPesquisaAlmox.FieldbyName('descricao').AsString, 250);
      lista_atual.FieldbyName('observacao').AsString:=edtOBSERVACAO.Text;
      lista_atual.FieldbyName('reserva_sn').AsBoolean:=cboxRESERVA_SN.Checked;
      lista_atual.Post;
(...)

procedure TfmView_rm_criacao.lista_atualCalcFields(DataSet: TDataSet);
var
  dQuantidade:Double;
  sQuantidade:String;
  sUnidade:String;
begin
  dQuantidade:=Dataset.FieldbyName('qtde_solicitada').AsFloat;
  if dQuantidade>0 then
  begin
    sQuantidade:=FloatToStr(dQuantidade);
    sUnidade:=Dataset.FieldbyName('unidade').AsString;
    //Dataset.FieldbyName('qtde_solicitada_com').AsString:=LeftStr(sQuantidade+#32+sUnidade, 12);
  end
end;