GARANTIR DESCONTO

Fórum IsEmpty funciona com ClientDataSet? Ou só com SQLDataSet? #354738

04/03/2008

0

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

Responder

Posts

04/03/2008

Flyskin

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


Responder

Gostei + 0

04/03/2008

Hall 9000

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!


Responder

Gostei + 0

01/09/2014

Roberto Novakosky

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

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar