Fórum Campo Serial #26399
16/09/2005
0
resolver isso ?
Grande abraço.
Winfor
Curtir tópico
+ 0Posts
16/09/2005
Bon Jovi
Ex. normal:
CREATE TABLE tabela
(
sequencial serial NOT NULL,
descricao varchar(50),
CONSTRAINT pk_tabela PRIMARY KEY (sequencial)
);
INSERT INTO tabela (descricao) VALUES (´aaa´);
Executou tudo ok.
SELECT * FROM tabela;
Retornado:
sequencial;descricao
1;´aaa´
Gostei + 0
17/09/2005
Winfor
O problema ocorre quando confirmo a inclusão do registro. E eu nem coloquei um componente ligado ao campo código para não haver problema.
A única coisa que fiz de anormal, foi modificar o tipo do campo na tabela após a mesma ter sido criada. Ou seja, ele estava como integer e eu passei para Serial.
No programa de manipulação do BD que é o EMS Manager funciona normalmente.
Gostei + 0
17/09/2005
Bon Jovi
procedure TfrmTeste.btnTesteClick(Sender: TObject); var i: integer; begin ADOCommand1.CommandText := ´CREATE TABLE teste (id_teste serial PRIMARY KEY, descricao VARCHAR(10))´; ADOCommand1.Execute; ADODataSet1.CommandText := ´SELECT id_teste, descricao FROM teste´; ClientDataSet1.Open; for i := 1 to 3 do begin ClientDataSet1.Append; ClientDataSet1.FieldByName(´descricao´).AsString := ´teste_´ + IntToStr(i); ClientDataSet1.Post; ClientDataSet1.ApplyUpdates(-1); ClientDataSet1.Refresh; end; ClientDataSet1.First; while not ClientDataSet1.Eof do begin ShowMessage(´ID_TESTE = ´ + ClientDataSet1.FieldByName(´id_teste´).AsString); ClientDataSet1.Next; end; end;
Gravou no banco e retornou: 1, 2, 3
Gostei + 0
17/09/2005
Bon Jovi
Gostei + 0
18/09/2005
Winfor
Na verdade, quando eu modifiquei o campo para serial ele criou um item na seção sequences do BD. Desta forma:
CREATE SEQUENCE ´public´.´professores_wpro_codigo_seq´
INCREMENT 1 MINVALUE 1
MAXVALUE 2147483647 START 5
CACHE 1;
Imagino que este sequence se assemelha ao campo Generator do Interbase, mas não sei como buscá-lo em tempo de execução. Na edição desta seguencia ele me mostra quais os valores aceita acima e qual será o próximo, mas não tô sabendo buscar isso de dentro do programa.
Vc busca na hora de postar o código ? Como ?
Estou estudando o manual do Postgres mas ainda não cheguei lá.
Valeu pela força. Grande abraço.
Wellington.
Gostei + 0
18/09/2005
Winfor
Wdm_cadastro.Qry_auxCadastro.Close;
Wdm_cadastro.Qry_auxCadastro.SQL.Add(´SELECT nextval(´public´.´sequence´.´professores_wpro_codigo_seq´) AS ULTIMOCODIGO´);
Wdm_cadastro.Qry_auxCadastro.Open;
Wdm_cadastro.Qry_auxCadastro.ExecSQL;
Nem sei se está certo, pq estou começando agora com SQL, mas ele erro se coloco public, se coloco sequence e se não coloco nada em nextval.
Vc sabe a sintaxe correta pra isso aí :)
Valeu mais uma vez !!!
Gostei + 0
18/09/2005
Bon Jovi
Faz normal:
CREATE TABLE cliente (id_cliente numeric(15) primary key, nome_cliente varchar(50));
CREATE SEQUENCE sequencial_cliente MINVALUE 1;
E no Delphi atribui ao campo:
SELECT nextval(´sequencial_cliente´) AS proximo
Gostei + 0
18/09/2005
Winfor
Para dar um select na tabela a partir da Query, ele somente aceitou quando eu coloquei assim:
SELECT * FROM ´public´.´professores´
De outra forma, sem o public ele fala que não existe a tabela.
Por isso que ao buscar o próximo código usei aquela instruição acima.
Continuo tentando.... aqui...
Obrigado pela paciência migão...
Gostei + 0
19/09/2005
Bon Jovi
Gostei + 0
19/09/2005
Bon Jovi
Só não coloquei a parte de conexão nesse exemplo, em que usei conexão ADO com driver ODBC.
Gostei + 0
19/09/2005
Winfor
Fiz uma nova aplicação, porém ao dar o Post, ele retorna o mesmo erro, mesmo dando o Refresh junto com o Apply. Mudei o Refresh de lugar, tentei outra atualização e não deu certo.
E na instrução SQL fala que não existe o campo sequencial que estou me referindo. Tentei usando ´public´, ´public´.´sequence´.nomedocampo, somente o nome do campo e ele continua não localizando o mesmo no BD.
Acho que o caminho é por aqui, tenho só que arranjar uma forma na sintaxe SQL de me comunicar com este campo serial e pegar o próximo valor dele. Fazendo isto posso atribuí-lo a um Dbedit e mandar postar pq aí eu sei que funciona. Pois já fiz o teste atribuindo diretamente um valor ao campo.
Continuando minha saga, obrigado pela atenção e ajuda.
Gostei + 0
19/09/2005
Bon Jovi
Coloque o trecho do seu código aqui, DFM dos componentes relacionados tb. Assim posso ver o q está fazendo. Coloque tudo que for diretamente relacionado, script da tabela tb.
Gostei + 0
23/09/2005
Winfor
Estive fora por 3 dias por isso sumi.
Eu utilizo um Trial da EMS Manager PostgresSQL para gerenciar e criar as tabelas, índices e outros do BD. Por isso não preciso necessariamente postar instruções SQL dentro da aplicação para dar manutenção do BD.
Na tela em questão do problema do campo serial, utilizo componentes da Devexpress normalmente, então coloco componentes cxdbEdit, CxMaskEdit, etc...
Utilizo tb o componente de menu da MaxComponets para o menu tipo outlook
Todos componentes tipo padrão que não dão interferências.
Então, após conectado o BD e criadas as tabelas com os Querys, clientDatasets, providers e DataSource. E criados os respectivos Tfields, dou um insert ou append e após a edição dos campos faço a rotina abaixo.
if MessageDlg(´Confirma a gravação dos dados deste funcionário ?´, mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
//CxTextEdit2.Text := intToStr(Wdm_cadastro.CDfuncionarioWPRO_CODIGO.value);
Try //Se a tabela está inserindo
If (Wdm_cadastro.CDfuncionario.State = DsInsert) then
Begin
Ufuncoes.WBotoes(Wdm_cadastro.DSfuncionario.DataSet,6);
end
else
ShowMessage(´Falha na atualização, o arquivo não está em modo de alteração !´);
Wdm_cadastro.CDfuncionario.ApplyUpdates(-1);
Wdm_cadastro.CDfuncionario.Refresh;
except
ShowMessage(´Erro de gravação´);
end;
At_botoes;
end;
Tudo dentro do padrão que a maioria está acostumada.
Dentro do EMS Manager os campos já estão definidos como serial. A única coisa que eu acho que poderia fazer alguma diferença, é o fato do campo codigo ter sido criado como Integer e depois eu o passai para Serial.
Se precisar de mais aguma informação é só falar.
Brigado migão...
Gostei + 0
23/09/2005
Winfor
2 DbEdit´s e um Dbnavigator.
Além de dar o mesmo erro de não aceitar o campo código vazio, se eu preencher o campo código com algum número, ele não atualiza o contador serial da tabela.
Por exemplo:
Tabela de portadores: Codigo (serial), Descricao (Varchar(30)
Tabela Vazia.
Ao inserir um registro com o dbedit em branco dá erro.
Ao inserir um registro com o dbedit com valor = 1 ele aceita
Ao inserir um registro com o dbedit com valor = 2 ele aceita
Ao tentar inserir um registro pelo gerenciador EMS Manager ele começa a contagem novamente dos registros. Ou seja, começa do 1. Pode ???
Tá complicado...
Gostei + 0
23/09/2005
Bon Jovi
Zeos já está bem estável com Midas?? Costumo sempre que possível usar os componentes mais padrões. Com ADO sei que funciona redondo. Se puder faz esse teste simples com ADO + ODBC. Ou poste um novo tópico mais específico: ´Campo Serial com Zeos + Midas´.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)