IsEmpty funciona com ClientDataSet? Ou só com SQLDataSet?
Estou com essa rotina de importação, vou colocar uma parte
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?
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
Curtidas 0
Respostas
Flyskin
04/03/2008
deve ser outro problema pois o isempty funciona perfeitamente no clientdataset...
GOSTEI 0
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!
//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
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;
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