Fórum problema no post firebird #336325

17/01/2007

0

Bom dia, Amigos!

estou com um grande problema aqui, tem dois dias que não consigo sair dele e a ajuda de voces vai ser de excelente valia.

quando estou dando post na tabela (DM.cdsOcoInclude.Post;) ele dá o erro:

Project project1.exe raised exception class EDBClient with message ´´. Process stopped. use step or Run to continue.

Essa tabela de ocorrencias, tem um campo que criei uma trigger para auto-incrementar o campo CODIGOocorrencia.
Se eu defino:

DM.cdsOcoIncludeCODIGOOCORRENCIAS.AsString := ´1´;
DM.cdsOcoInclude.Post;

ele grava no post sem problema, mas assim, não incrementa o campo Codigo, e todos os registros ficam com CODIGOOCORRENCIAS = 1
Ou seja, não resolve

estou nessa briga a facadas com essas duas linhas tem umas 20 horas seguidas... please!! alguem pode me ajudar?


Garciabh3

Garciabh3

Responder

Posts

17/01/2007

Landersongomes

Boa tare amigo...
Vc está usando acesso via dbExperss?

Caso seja procure sobre providerFlags dos Tfields...

Uma outra opção seria vc usar uma query informando o valor max de codigo e acrescentar um a este... tipo:

if dmSAE.cdsCadDoctosID_DOCTO.IsNull then
dmSAE.cdsCadDoctosID_DOCTO.AsInteger :=
dmSAE.cdsMaxDoctoMAX.AsInteger + 1;
dmSAE.cdsCadDoctos.Post;

Lembrando sempre de abrir a query antes e fechar depois das atualizações.


Responder

Gostei + 0

17/01/2007

Aroldo Zanela

Colega,

Você está usando ClientDataSet? Se sim, usou ApplyUpdates(-1)? Pode colocar um fragmento maior do código?


Responder

Gostei + 0

17/01/2007

Emerson Nascimento

altere a propriedade Required do campo DM.cdsOcoIncludeCODIGOOCORRENCIAS para False e grave sem passar qualquer valor para ele (deixe nulo).
veja se resolve


Responder

Gostei + 0

17/01/2007

Garciabh3

nó!!!.. brigadão por estarem me ajudando

landersongomes:
Sim, estou usando dbExpress e ClientDataSet

Aroldo:
ele dá pau no post, antes do applyupdates
(não chega na parte do apply)

trecho do codigo mais detalhado:
  if (Funcao = ´Inserir´) then
    begin
      DM.cdsOcoInclude.Open;
      DM.cdsOcoInclude.insert;
      DM.cdsOcoIncludeDATA.AsString := DateToStr(now);
      DM.cdsOcoInclude.Post;
      DM.cdsOcoInclude.ApplyUpdates(0);
    end;


é simples, mas to apanhando de 20 a 0

emerson:
já tinha alterado a Flag para required false, mas se eu não passo nada para o campo, dá aquela mensagem de erro sinistra. se eu passo, funciona (mas não auto-incrementa)


Responder

Gostei + 0

17/01/2007

Garciabh3

AAAAAAAAAAAAAAAEEEEEEEEEEEEEEEEEEWWWWWWWWWWWWWWWW!!!

UWHOOOOOOOO

funcionou!!!

brigadão pela luz!!!

consegui alterando a trigger

CREATE TRIGGER TRG_OCORRENCIAS_INC
FOR OCORRENCIAS ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if (NEW.CODIGOOCORRENCIAS = 0) then
NEW.CODIGOOCORRENCIAS = GEN_ID(GEN_OCORRENCIAS_ID, 1);
END



sem o if (NEW.CODIGOOCORRENCIAS = 0) then
quando eu ia editar, ele fazia uma confusão doida


era mesmo problema de trigger, agora deu!
pra quem ler este post no futuro com esta duvida,
eu passo o
DM.cdsOcoIncludeCODIGOOCORRENCIAS.AsInteger := 0;

e uso o novo trigger

nó... que luta!!!

valeu, gente


Responder

Gostei + 0

18/01/2007

Bruno.sensatta

ola... eu trabalho com banco de dados oracle, não sei se é o mesmo que vc utiliza, mas se for tenhu uma solução legal para esse problema, vc poderia ao inves de utilizar uma triger utilizar uma sequence, é mais lógico do que disparar uma triger quando for gravar, com a sequence vc consegue trazer o próximo valor na hora em que for começar ainserir os dados, vamus a um exemplo

CREATE SEQUENCE <NOME_DA_SEQUENCE>
minvalue 1
maxvalue 99999999999
start with 1
increment by 1
nocache;

esta criada a sequence, agora para chama-la basta vc colocar no evento after insert do Client data set a seguinte query

Select <nome_da_sequence>.nextvalue SEQUENCIAL from dual

simples não acha ??

só entendendo o que fiz, montei um select e renomei o nome da coluna que ira retornar para SEQUENCIAL, agora basta vc atribuir o valor desta coluna no campo onde deseja exibila, ou passa-la para o client data set no respectivo campo....

Espero ter ajudado um pouco mais,

Abraços!!


Responder

Gostei + 0

18/01/2007

Bruno.sensatta

ola... eu trabalho com banco de dados oracle, não sei se é o mesmo que vc utiliza, mas se for tenhu uma solução legal para esse problema, vc poderia ao inves de utilizar uma triger utilizar uma sequence, é mais lógico do que disparar uma triger quando for gravar, com a sequence vc consegue trazer o próximo valor na hora em que for começar ainserir os dados, vamus a um exemplo

CREATE SEQUENCE <NOME_DA_SEQUENCE>
minvalue 1
maxvalue 99999999999
start with 1
increment by 1
nocache;

esta criada a sequence, agora para chama-la basta vc colocar no evento after insert do Client data set a seguinte query

Select <nome_da_sequence>.nextvalue SEQUENCIAL from dual

simples não acha ??

só entendendo o que fiz, montei um select e renomei o nome da coluna que ira retornar para SEQUENCIAL, agora basta vc atribuir o valor desta coluna no campo onde deseja exibila, ou passa-la para o client data set no respectivo campo....

Espero ter ajudado um pouco mais,

Abraços!!


Responder

Gostei + 0

18/01/2007

Bruno.sensatta

me desculpe agora eu vi que seu bando é firebird, mas acho que o comando para criação da sequence deve ser o mesmo... espero ter ajudadoo!!

=)


Responder

Gostei + 0

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

Aceitar