IsEmpty funciona com ClientDataSet? Ou só com SQLDataSet?

Delphi

04/03/2008

Estou com essa rotina de importação, vou colocar uma parte
  begin
    Application.ProcessMessages;
    Readln(farq, linha); //Lê a linha e posiciona o cursor na próxima
    Caption := ´Lendo Linha: ´ + IntToStr(i) + ´ de: ´ + IntToStr(pb.Max);

    //Buscando pelo Parâmetro codigo, para verificar se já existe na tabela
    dm.cdsMaterial.Params.ParamByName(´COD_ORDENADO´).asString := Trim(Copy(Linha, 1, 6));
    dm.cdsMaterial.Open;  //Abre o CDS

    if dm.cdsMaterial.IsEmpty then   //Se Não existir o registro
     begin
      dm.cdsMaterial.Append; //Insira os dados da linha atual
     end

    else //Senão, se o registro já existir
      dm.cdsMaterial.Edit; //Coloca em modo de edição para atualizar os campos

    //Aqui os campos recebem as linhas lidas
    dm.cdsMaterialCOD_ORDENADO.AsString := Trim(Copy(Linha, 1, 6));
    dm.cdsMaterialDESCRICAO.Value := Trim(Copy(Linha, 8, 30));
    dm.cdsMaterialUN.Value := Trim(Copy(Linha, 39, 30));
    dm.cdsMaterialPRECO_UNITARIO.AsString := Trim(Copy(Linha, 70, 30));
    dm.cdsMaterial.Post; //Salve o registro em memória
    //dm.cdsMaterial.ApplyUpdates(0);  //Aplica as atualizações em memória no banco //Já está no DM.cdsMaterialAfterPost
    dm.cdsMaterial.Close;  //Fecha o CDS
    Inc(i);
    pb.Position := pb.Position + 1;
    Next;

O problema é no dm.cdsMaterial.IsEmpty, quer dizer ele está entendendo que está vazio, mas na realidade está os mesmo dados da tabela MATERIAIS, aí ele deveria pular para o
ELSE
dm.cdsMaterial.Edit;
Só que isso não acontece. O que pode ser?


Jpauloss

Jpauloss

Curtidas 0

Respostas

Flyskin

Flyskin

04/03/2008

deve ser outro problema pois o isempty funciona perfeitamente no clientdataset...


GOSTEI 0
Hall 9000

Hall 9000

04/03/2008

Bom, se o código seu está exatamente como vc postou abaixo:
//Buscando pelo Parâmetro codigo, para verificar se já existe na tabela
dm.cdsMaterial.Params.ParamByName(´COD_ORDENADO´).asString := Trim(Copy(Linha, 1, 6));
dm.cdsMaterial.Open; //Abre o CDS

if dm.cdsMaterial.IsEmpty then //Se Não existir o registro
begin
dm.cdsMaterial.Append; //Insira os dados da linha atual
end

O problema pode estar no fato de vc não estar fechando cds antes de refazer a pesquisa. Ficaria assim:

dm.cdsMaterial.Close;// adicionar esta linha!!!!!!

dm.cdsMaterial.Params.ParamByName(´COD_ORDENADO´).asString := Trim(Copy(Linha, 1, 6));
dm.cdsMaterial.Open; //Abre o CDS

if dm.cdsMaterial.IsEmpty then //Se Não existir o registro
begin
dm.cdsMaterial.Append; //Insira os dados da linha atual
end

Lembrando, o IsEmpty funciona normal no cds.

Falou!


GOSTEI 0
Roberto Novakosky

Roberto Novakosky

04/03/2008

Existe uma armadilha de programação que pode ser o teu caso.

Verifique se o teu ClientDataSet está ligado a algum DBCheckBox, e se o DBCheckBox possui algum evento programado nele. (pode ser algum outro componente visual tb)
Se tiver evento programado neste componente, tenha certeza que verificar antes cds.IsEmpty. (só porque o DBCheckBox tem um evento de onClick mexendo no cds, o client retorna IsEmpty como falso, porque é adicionado automaticamente um record vazio no cds, mas como ainda nao tem post recordCount continua retornando zero, entendeu .. isEmpty passa a retornar falso, porque existe um record pendente no cds). Para resolver faça um código dentro do evento para saltar fora como
no onClick por exemplo (pode ser algum outro teu)
if cds_xxx.IsEmpty then Exit;
GOSTEI 0
POSTAR