Incluir, Altera, Excluir, com DBExpress alguem pode meAjuda?

Delphi

12/01/2007

Tenho uma Tabela chamada Bairro com um campo NOME_BAIRRO


Coloquei um Data Module com um componente SQLConection da palheta DBExpress.

Já configurei o SQLConection para o acesso ao Banco de dados ´Firebird´

Coloquei um formulário com 4 botões com o nome (Incluir, Alterar, Excluir e Sair), um DBComboBox e um DBGrid.

Eu quero com esse botões realizar a incluisão, alteração e exclusão de registros.

Alguem pode me ajudar, pois sou novato este componente.


Max2006

Max2006

Curtidas 0

Respostas

Ruyoutor

Ruyoutor

12/01/2007

Vou te passar um exemplo para ver se você consegue

1 - Coleque na sua aplicação um conponente SQLDataSet da paleta DBExpress aponte ele para o sqlconnection
2 - fassa a sim quando for incluir
          try
            Transacao.TransactionID:= 1;
            Transacao.IsolationLevel:= xilREPEATABLEREAD;
            DM.SQLConnection1.StartTransaction(transacao);
            MSQL:= ´insert into Bairro (Nome_Bairro) values (:Bairro)
            SQLDataSet1.Close;
            SQLDataSet1.CommandType:= ctQuery;
            SQLDataSet1.CommandText:= MSQL;
            SQLDataSet1.ParamByName(´bairro´).AsString:=   DBComboBox.text;
           SQLDML.ExecSQL;
            DM.SQLConnection1.Commit(transacao);
            SimpleDataSet.Refresh;
         except
            DM.SQLConnection1.Rollback(transacao);

Explicação
Transacao - é uma variavel que tem que ser criada, o tipo é TTransactionDesc você inicia a transação no inicial através do StartTransaction do SqlConnection.

MSQL - é uma variavel string só para receber o codigo sql
Parâmetros - você vai ter que fazer essa inclusão por parâmetros usando a Função ParamByName para passar o valor do DBComboBox.text para o parâmetro.

Depois de passar os parametros vc executa o sqldataset e da um commit na transação.

para o DBGrid você vai ter que usar um simpledataset e um datasource ligados
vá na propriedade dataset do simpledataset e depois entre em commandText insira uma consulta sql para aparecer os capos no dbgrid

OBS: o unico componente que vc pode ligar a um dbgrid dessa paleta é o simpledataset porque é bidirecional observe que quando eu termino a inclusão eu dou um refresh nele para atualizar o dbgrid.

Alterar você usaria o updade ´Update bairro set (Nome_bairro = :bairro) where codigo do bairro = :cdbairro´ e passaria o bairro e o codigo do bairro por parâmetro.

Excluir você usaria o codigo do ´delete * from Bairro where codigo do bairro = :cdbairro´ e passaria o codigo do bairro por parâmetro.

cara testa pra ver se funciona se não funcionar não esta tão longe porque eu sempre utilizei os componentes do DBExpress assim.


GOSTEI 0
Max2006

Max2006

12/01/2007

Coloquei um Table e na propriedade SQLConnection coloquei o componente SQLConection e na Table Name coloquei bairro.

No Botão Incluir cliquei e digitei Table.Append;

Então apareceu a mensagem.

Cannot modify a read-only dataset
Não pode modificar uma série de dados de leitura apenas.

Está informando que os dados está como leitura e agora como eu coloco de forma que eu possa Incluir dados?


GOSTEI 0
Max2006

Max2006

12/01/2007

Eu vou tenvar......


GOSTEI 0
Max2006

Max2006

12/01/2007

Quando eu cliquei no Botão incluir apareceu a seguinte mensagem X marcando o xilREPEATABLEREAD em vermelho.


procedure T_BAIRRO.BitBtn1Click(Sender: TObject);
begin
//_DM.SQLTable1.Append;
try
Transacao.TransactionID:= 1;
Transacao.IsolationLevel:= xilREPEATABLEREAD;
Udeclared idenfitier xilREPEATABLEREAD


GOSTEI 0
Ruyoutor

Ruyoutor

12/01/2007

Entre na parte dos codigos do seu DataModule e em uses lá em cima copie todas as units que tem lá e cole ná clausula uses do Form que vc tá colocando o código de inserção

e veja se funciona


GOSTEI 0
Ruyoutor

Ruyoutor

12/01/2007

Outra coisa amigo eu sempre trabalhei com esse componentes da DBExpress usando Edit´s e combo´s numca usei dbcombo e dbedit usando DBcombo eu não garanto que vai funcionar


GOSTEI 0
Max2006

Max2006

12/01/2007

OBS: Passou para á próxima linha mas não deixou eu inserir a Unit Classes...

Agorá está na última linha dizendo que a string é indeterminada mas eu já declarei como mostra oque pode ser...?


var
_BAIRRO: T_BAIRRO;
MSQL:String;



implementation

uses INTERCAMBIO;

{$R *.dfm}

procedure T_BAIRRO.BitBtn1Click(Sender: TObject);
begin
//_DM.SQLTable1.Append;
try
Transacao.TransactionID:= 1;
Transacao.IsolationLevel:= xilREPEATABLEREAD;
_DM.SQLConnection1.StartTransaction(transacao);
MSQL:= ´insert into Bairro (Nome_Bairro) values (:Bairro)
Interminate String a última linha está em vermelho..


GOSTEI 0
Max2006

Max2006

12/01/2007

Passei para mais um pará metro

Oque é isso ´SQLDML.ExecSQL;´ está informando undeclared identifier SQLDML.


GOSTEI 0
Max2006

Max2006

12/01/2007

Consegui fazer roda com esse código.

procedure T_BAIRRO.BitBtn1Click(Sender: TObject);
begin
//_DM.SQLTable1.Append;
try
Transacao.TransactionID:= 1;
Transacao.IsolationLevel:= xilREPEATABLEREAD;
_DM.SQLConnection1.StartTransaction(transacao);
MSQL:= ´insert into Bairro (Nome_Bairro) values (:Bairro)´;
_DM.SQLDataSet1.Close;
_DM.SQLDataSet1.CommandType:= ctQuery;
_DM.SQLDataSet1.CommandText:= MSQL;
_Dm.SQLDataSet1.ParamByName(´bairro´).AsString:= DBComboBox1.text;
_Dm.SQLDataSet1.ExecSQL;
//SQLDML.ExecSQL;
_DM.SQLConnection1.Commit(transacao);
_DM.SimpleDataSet1.Refresh;
except
_DM.SQLConnection1.Rollback(transacao);

End;
end;

Agora vou ver como e que se faz para ligar o DBComboBox como vc me explicou....


GOSTEI 0
Max2006

Max2006

12/01/2007

Coloquei um componente SimpleDataSet

Na propriedade Connection coloquei o SQLConnection.
Cliquei com o botão direito sobre o componente e cliquei em Edit Internal DataSet
Na propriedade CommandTex coloquei (select NOME_BAIRRO from BAIRRO;
Na propriedade ShemaName coloquei como SYSDBA
Cliquei denovo no componente e coloquei a propriedade Active do componente como True.

Executei o programa coloque um combobox em vez de um DBCombobox digitei no combobox cliquei no
botão incluir e funcionou agora vou ver como que se deleta.


GOSTEI 0
Max2006

Max2006

12/01/2007

Este é o código...
De atualização.
Mas deu erro e me parece que é na linha SQL oque fzer...?
tOKEN UNKNOWN - LINE1, CHAR19


procedure T_BAIRRO.BitBtn2Click(Sender: TObject);
begin
try
Transacao.TransactionID:= 1;
Transacao.IsolationLevel:= xilREPEATABLEREAD;
_DM.SQLConnection1.StartTransaction(transacao);
MSQL:= ´Update bairro set (Nome_bairro = :bairro)´;
_DM.SQLDataSet1.Close;
_DM.SQLDataSet1.CommandType:= ctQuery;
_DM.SQLDataSet1.CommandText:= MSQL;
_Dm.SQLDataSet1.ParamByName(´BAIRRO´).AsString:= DBComboBox1.text;
_Dm.SQLDataSet1.ExecSQL;
//SQLDML.ExecSQL;
_DM.SQLConnection1.Commit(transacao);
_DM.SimpleDataSet1.Refresh;
except
_DM.SQLConnection1.Rollback(transacao);

end;
end;


GOSTEI 0
Max2006

Max2006

12/01/2007

O nome está BDComboBox mas é um combobox....


GOSTEI 0
Ruyoutor

Ruyoutor

12/01/2007

O seu codigo de update está errado

Seria assim

´Update set Bairro (Nome_bairro = :bairro) where Codido do bairro = :cdBairro)

Passe o cdbairro como parâmetro


GOSTEI 0
Max2006

Max2006

12/01/2007

O seu codigo de update está errado Seria assim ´Update set Bairro (Nome_bairro = :bairro) where Codido do bairro = :cdBairro) Passe o cdbairro como parâmetro


Mas eu não tenho o campo código eu só tenho o campo ´nome_bairro´, e quando eu uso este comando SQL

MSQL:= ´Update set Bairro (Nome_bairro = :bairro) where Codido do bairro = :cdBairro)´;

Da o seguinte érro.

Esta dando erro: - Line1, char8


GOSTEI 0
Ruyoutor

Ruyoutor

12/01/2007

de dois cliques em cima do simpledataset que vc adiconou na janela que vai abrir você clica com o direito do mouse e selecione add all fields

na consulta vc vai colocar assim

update set bairro (nome_bairro = :bairro) where nome_bairro = :oldNome

SQLDataSet1.Parambyname(´bairro´).asstring := valor do novo bairro
SQLDataSet1.parambyname(´oldbairro).asstring := SimpleDataSetNome_Bairro.value;

eu botei simpledataset e sqldataset porque eu não sei o nome dos seus componentes mas é só mudar você vai passar por parâmetro o valor novo do nome do bairro pelo combo ou edit e o nome do bairro antigo que é o que esta atualmente na tabela por isso você vai usar o Simpledatasetnome_bairro.value.

Acho que agora vai! Tenta ai


GOSTEI 0
Brunolspp

Brunolspp

12/01/2007

Então

no meu link de downloads tem uma apostila de desenvolvimento client/server q mostra em detalhes e bem didatico passo a passo a construção deste tipo de cadastro

link:
http://cc.codegear.com/Author/795118


GOSTEI 0
Max2006

Max2006

12/01/2007

try
Transacao.TransactionID:= 1;
Transacao.IsolationLevel:= xilREPEATABLEREAD;
_DM.SQLConnection1.StartTransaction(transacao);
// MSQL:= ´update set bairro (nome_bairro = :bairro) where nome_bairro = :oldNome´;
MSQL:= ´update set bairro (nome_bairro = :bairro) where nome_bairro = :oldNome´;

//MSQL:= ´update bairro set nome_bairro = ´Max´´;
_DM.SQLDataSet1.Close;
_DM.SQLDataSet1.CommandType:= ctQuery;
_DM.SQLDataSet1.CommandText:= MSQL;
_Dm.SQLDataSet1.ParamByName(´bairro´).AsString:= ComboBox1.text;
_Dm.SQLDataSet1.ExecSQL;
_DM.SQLConnection1.Commit(transacao);
_DM.SimpleDataSet1.Refresh;
except
_DM.SQLConnection1.Rollback(transacao);

End;


Eu so tenho um campo chamado Nome_Bairro.

Eu consigo inserir é só mudar o SLQ para

MSQL:= ´insert into Bairro (Nome_Bairro) values (:bairro)´;

Mas quando tento alterar os dados está dando a informação de erro no SQL -

>>>>> Token unkwn - line, char 8


GOSTEI 0
Ruyoutor

Ruyoutor

12/01/2007

Cara vc precisa passar o valor do parâmetro :oldnome.

Faz da forma que eu te falei que vai dar certo, de dois cliques em cima do simpledataset click com direito do mouse e click em add all fields na hora de passar os parâmetros vc passa:

SqlDataset.parambyname(´oldbairro´).asstring := SimpleDatasetNome_Bairro.value;

Nesse simpledataetNomeBairro.value esta o valor que vc está querendo alterar no banco ou seja o valor antigo que vai ser substituido, através de clausula where é que vc está dizendo para ele qual o registro que vc quer alterar se vc não passar o parâmetro ele não tem como saber.


GOSTEI 0
Brasidata

Brasidata

12/01/2007

Bom dia max2006.

Te peço mil desculpas se for uma falha de compreensão minha, mas se o que vc quer fazer é simplesmente usar os componentes do DBExpress para interagir com sua base de dados Firebird eu substituiria toda essa ´ginástica´ acima por uma combinação mais simplificada de componentes. Explicando melhor:

Você já tem um TSQLConnection ligado ao seu banco Firebird.
Pois bem: Agora adicione ao seu DataModule (Que vou chamar de DM) um TSQLDataSet (palheta DBExpress), um TDataSetProvider, um TClientDataSet e um TDataSource (palheta DATA ACCESS).
Ligue o SQLDataSet ao SQLConnection através da propriedade SQLConnection, Ligue o DataSetProvider ao SQLDataSet atraves da propriedade DataSet, Ligue o ClientDataSet ao DataSetProvider através da propriedade PROVIDER NAME e por fim ligue o DataSource ao ClientDataSet através da propriedade DataSet.
Coloque na propriedade CommandText do SQLDataSet ´select NOME_BAIRRO from BAIRRO´ a acrescente o campo NOME_BAIRRO no SQLDataSet e depois no ClientDataSet usando o FieldEditor (duplo clique nos componentes).
Pronto: Agora é só direcionar o seu DBGRID e o seu DBCombobox para o DataSource.

Abra o ClientDataSet1 no OnCreate do seu Form (e feche-o no OnClose, é claro):

DM.ClientDataSet1.Open;

Nos botões use os códigos:

INCLUIR:
DM.ClientDataset1.Append;

ALTERAR (Se a propriedade AutoEdit do DataSource estiver TRUE não é necessário este botão)
DM.ClientDataSet1.Edit;

EXCLUIR
DM.ClientDataSet1.Delete;

GRAVAR ( Aplicar Alterações )
If DM.ClientDataSet1.ApplyUpDates(0) = 0 then
ShowMessage(´Registro gravado´)
else
begin
ShowMessage(´Falha ao Gravar Registro´);
DM.ClientDataSet1.Cancel;
end;

(Onde DM é seu DataModule e ClientDataSet1 é o seu TClientDataSet)

Isso é uma forma rápida e bem simplificada do uso do DBExpress. Se você explorar mais o site da DevMedia encontrará muitas dicas, artigos e até vídeo-aulas sobre o assunto, com códigos bem mais elaborados.
Essa combinação (SqlConnection, SqlDataSet, DataSetProvider e ClientDataSet) é fantástica, tem excelente performance e trabalha com os dados em cache diminuindo muito o tráfego de informações entre seu aplicativo e o banco de dados.
Um outro macete legal é setar a propriedade KEEP CONNECTION do SQLConnection para FALSE e tem muitas outras dicas que dariam um livro sobre o assunto.

Abraços e bom trabalho...


GOSTEI 0
Ruyoutor

Ruyoutor

12/01/2007

Pronto tá resolvido o problema!

Realmente muito mais fácil, até eu aprendi, pois não conhecia essa forma de trabalhar.

Mandou muito bem!


GOSTEI 0
POSTAR