 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
28440959842 Aprendiz

Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 166
|
Enviada: Sex Dez 21, 2012 8:12 pm Assunto: DbGrid |
|
|
Amigos!
Me desculpe a insistência, mas ainda estou com a dúvida do DBGrid que está me consumindo, já perguntei para vários desenvolvedores, algumas vezes aqui no forum, mas acho que não me fiz entender direito, vou tentar detalhar o máximo:
o que fiz:
No form coloquei uma dbgrid, um conexão ADO, uma query, e um DS.
Liguei a query na conexão ADO, a query no DS, e por final o DS liguei no DBGrid, onde me mostrou as informações que tinha na query.
Se eu digitar diretamente as informações na Grid, e dar seta para baixo, estas informações são gravadas imediatamente no banco.
Agora vem a minha dúvida:
queria digitar no DBGrid, mas só gravar quando eu executar um botão, ou seja, preencho três, quatro linhas, e depois executo o botão, ai sim dou um post.
Pois fiz uma tela de entrada de documentos, onde via edit eu coloco o cabeçalho, e tenho um botão que habilita a grid enable:=true.
Mas ai vou digitando os produtos na grid, mas ela já vai gravando no banco de dados,e se precisar alterar a linha de cima, apresenta erros, a linha nao está em modo de inserção, etc, uma dor de cabeça só.
Gostaria de ouvir a opinião dos amigos sobre isso, continuo com dbgrid, uso string grid (da para digitar e depois salvar?).
Espero encarecidamente da ajuda de vocês! |
|
| Voltar ao Topo |
|
 |
Batera Colaborador


Registrado: Quarta-Feira, 23 de Julho de 2008 Mensagens: 4899 Localização: Maringá
|
Enviada: Sex Dez 21, 2012 8:58 pm Assunto: |
|
|
| Qual banco de dados você está usando? |
|
| Voltar ao Topo |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Sex Dez 21, 2012 9:09 pm Assunto: |
|
|
Utilize o trio adoconnection mais adodataset, datasetprovider, clientdaset, assim os dados somente serão gravados no banco com um applyupdates().
O único problema é com mestre/detalhes utilizando-se datasetfields devido ao campo de autoincremento, como não é gerado antes e não achei uma maneira de fazer isto, dá erro.
Contornei isto com gambiarra no access, visto que este campo autoincremento somente é aplicado quando é gravado ficamente no banco, mas em mestre/detalhe vc precisa dele antes para passar aos filhos, neste tipo de relacionamento com datasetfield.
bye _________________ P.O.W.E.R B.Y D.E.L.P.H.I |
|
| Voltar ao Topo |
|
 |
28440959842 Aprendiz

Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 166
|
Enviada: Sex Dez 21, 2012 10:23 pm Assunto: |
|
|
| Batera... estou usando Oracle! |
|
| Voltar ao Topo |
|
 |
Oseiasao Membro Junior


Registrado: Sexta-Feira, 14 de Outubro de 2011 Mensagens: 303
|
Enviada: Sex Dez 21, 2012 10:25 pm Assunto: |
|
|
ola amigo, eu fiz algo parecido com um StringGrid, a diferença é que eu estou coletando os dados vindo de lugares diferentes, no seu caso, vc precisa que seja inserido nele, dependendo de qts campos são, voce pode colocar uma qtd de edit's no seu form e um botão para inserir, alguns dados voce pode inserir por codigo, e para o caso do usuario precisar alterar, voce insere outros edits, não sei se te atende, no meu caso eram poucos campos, mas imagina se é uma tela de cadastro, não e mt viável voce inserir 30 edit.
Vou postar abaixo os códigos que eu usei ...
******** BOTÃO INSERIR *************
| Código: |
procedure TFrmCadPresCont.BtnInsClick(Sender: TObject);
Var
Soma: Integer;
begin
Soma := 1;
{******************************************************************************
*******************************************************************************
SE PRESSIONAR O BOTÃO INSERIR E NÃO TIVER NENHUMA IGREJA SELECIONADO,
ENTÃO ORIENTA O MEMBRO A SELECIONAR A IGREJA
*******************************************************************************
******************************************************************************}
if Length(Trim(JVDBLCong.Text)) = 0 then
begin
Application.MessageBox('Selecione a congregação', 'INFORMAÇÃO', 0);
JVDBLCong.SetFocus;
Abort;
end;
{******************************************************************************
*******************************************************************************
SE PRESSIONAR O BOTÃO INSERIR E NÃO TIVER NENHUM MEMBRO SELECIONADO,
ENTÃO ORIENTA O USUÁRIO A SELECIONAR O MEMBRO
*******************************************************************************
******************************************************************************}
if Length(Trim(JvDBLDiz.Text)) = 0 then
begin
if ChkDiz.Checked = False then
begin
Application.MessageBox('Selecione o membro', 'INFORMAÇÃO', 0);
JvDBLDiz.SetFocus;
Abort;
end;
end;
{******************************************************************************
*******************************************************************************
SE TIVER SELECIONADO O MEMBRO E NÃO INSERIR O VALOR, ORIENTAR DIGITAR
O VALOR DO DIZIMO.
*******************************************************************************
******************************************************************************}
if (JvDBLDiz.KeyValue > 0) and (EdtDizimista.AsFloat = 0) then
begin
Application.MessageBox('Digite o valor do dízimo', 'INFORMAÇÃO', 0);
EdtDizimista.SetFocus;
Abort;
end;
LnVer := 1;
{******************************************************************************
*******************************************************************************
VERIFICANDO SE O MEMBRO SELECIONADO JÁ
ESTÁ INSERIDO NA RELAÇÃO ATUAL
*******************************************************************************
******************************************************************************}
if ChkDiz.Checked = False then
begin
while LnVer <L> 4 then
begin
if L > 0 then
begin
StrGrdDiz.RowCount := StrGrdDiz.RowCount + 1;
StrGrdDiz.Cells[C0,L] := IntToStr(L);
StrGrdDiz.Cells[C1,L] := '0';
StrGrdDiz.Cells[C2,L] := EdtDizViz.Text;
StrGrdDiz.Cells[C3,L] := JVDBLCong.Text;
StrGrdDiz.Cells[C4,L] := DateToStr(Now);
StrGrdDiz.Cells[C5,L] := EdtDizimista.Text;
StrGrdDiz.Cells[C6,L] := JVDBLCong.KeyValue;
end;
end
Else
begin
Application.MessageBox('Insira o nome do Dizimista', 'VISITANTE', 0);
EdtDizViz.SetFocus;
Abort;
end;
end
else
begin
if L > 0 then
begin
StrGrdDiz.RowCount := StrGrdDiz.RowCount + 1;
StrGrdDiz.Cells[C0,L] := IntToStr(L);
StrGrdDiz.Cells[C1,L] := JvDBLDiz.KeyValue;
StrGrdDiz.Cells[C2,L] := JvDBLDiz.Text;
StrGrdDiz.Cells[C3,L] := JVDBLCong.Text;
StrGrdDiz.Cells[C4,L] := DateToStr(Now);
StrGrdDiz.Cells[C5,L] := EdtDizimista.Text;
StrGrdDiz.Cells[C6,L] := JVDBLCong.KeyValue;
end;
end;
L := L + 1;
{******************************************************************************
*******************************************************************************
SOMANDO TOTAL DE DIZIMOS DO STRINGGRID
*******************************************************************************
******************************************************************************}
EdtVlDiz.AsCurrency := EdtDizimista.AsCurrency + EdtVlDiz.AsCurrency;
{******************************************************************************
*******************************************************************************
LIMPANDO CAMPOS PARA INSERIR NOVOS DIZIMISTAS
*******************************************************************************
******************************************************************************}
JvDBLDiz.KeyValue := -1;
EdtDizimista.AsCurrency := 0;
end;
|
| Código: |
procedure TFrmCadPresCont.StrGrdDizSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
Var
key: Word;
begin
{*******************************************************************************
********************************************************************************
PEGANDO A LINHA SELECIONADA
********************************************************************************
*******************************************************************************}
try
StrToint(StrGrdDiz.Cells[0,ARow]);
except
on Esc:Exception do
Begin
ShowMessage('Linha inválida');
Abort;
End;
end;
LnSel := StrToInt(StrGrdDiz.Cells[0,ARow]);
end;
|
*********************deletando linha ***********************
| Código: |
procedure TFrmCadPresCont.StrGrdDizKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
Var
ACol, ARow :Integer;
Cont, NLinha :Integer;
LnDel :Integer;
begin
LnDel := 1;
{*******************************************************************************
********************************************************************************
DELETAR DADOS DA LINHA SELECIONADA
SE A LINHA SELECIONADA JA ESTIVER VAZIA,
ENTÃO INFORMA QUE E UMA LINHA INVÁLIDA
********************************************************************************
*******************************************************************************}
if (Key = vk_delete) and (LnSel > L) then
begin
ShowMessage('A linha selecionada não e válida');
Abort;
end;
{*******************************************************************************
********************************************************************************
VERIFICANDO SE A TECLA DELETE FOI PRESSIONADA
AO SELECIONAR UM DIZIMISTA
********************************************************************************
*******************************************************************************}
if Key = VK_DELETE then
begin
{*******************************************************************************
********************************************************************************
VERIFICANDO SE A LINHA SELECIONADA É A ULTIMA DO GRID
********************************************************************************
*******************************************************************************}
if LnSel = L then
begin
Application.MessageBox('A linha selecionada não contém membro',
'Informação', 0);
Abort;
end;
{*******************************************************************************
********************************************************************************
DIMINUINDO O DIZIMO DA LINHA SELECIONADA
NO CAMPO DO VALOR TOTAL DOS DIZIMOS
********************************************************************************
*******************************************************************************}
EdtValor.Text := StrGrdDiz.Cells[C5,LnSel]; // PASSANDO VALOR PARA CALCULO
EdtVlDiz.AsCurrency := EdtVlDiz.AsCurrency - EdtValor.AsCurrency;
{*******************************************************************************
********************************************************************************
LIMPANDO A LINHA SELECIONADA
********************************************************************************
*******************************************************************************}
StrGrdDiz.Cells[C0,LnSel] := '';
StrGrdDiz.Cells[C1,LnSel] := '';
StrGrdDiz.Cells[C2,LnSel] := '';
StrGrdDiz.Cells[C3,LnSel] := '';
StrGrdDiz.Cells[C4,LnSel] := '';
StrGrdDiz.Cells[C5,LnSel] := '';
{*******************************************************************************
********************************************************************************
SUBINDO UMA LINHA, TODOS OS DADOS DAS LINHAS
ABAIXO DA QUE FOI LIMPA
********************************************************************************
*******************************************************************************}
while LnDel < (StrGrdDiz.RowCount - 1) do
begin
if StrGrdDiz.Cells[0,LnSel+1] <> '' then
StrGrdDiz.Cells[C0,LnSel] := IntToStr(StrToInt(StrGrdDiz.Cells[0,LnSel+1])-1);
if StrGrdDiz.Cells[0,LnSel+1] = '' then
StrGrdDiz.Cells[C0,LnSel] := StrGrdDiz.Cells[0,LnSel+1];
StrGrdDiz.Cells[C1,LnSel] := StrGrdDiz.Cells[1,LnSel+1];
StrGrdDiz.Cells[C2,LnSel] := StrGrdDiz.Cells[2,LnSel+1];
StrGrdDiz.Cells[C3,LnSel] := StrGrdDiz.Cells[3,LnSel+1];
StrGrdDiz.Cells[C4,LnSel] := StrGrdDiz.Cells[4,LnSel+1];
StrGrdDiz.Cells[C5,LnSel] := StrGrdDiz.Cells[5,LnSel+1];
LnDel := LnDel + 1;
LnSel := LnSel + 1;
end;
{*******************************************************************************
********************************************************************************
DELETANDO A ULTIMA LINHA QUE FICOU VAZIA
********************************************************************************
*******************************************************************************}
StrGrdDiz.RowCount := StrGrdDiz.RowCount - 1;
L := L - 1;
end;
end;
|
_________________ Melhor é o fim das coisas do que o principio delas .... (Salomão) |
|
| Voltar ao Topo |
|
 |
Batera Colaborador


Registrado: Quarta-Feira, 23 de Julho de 2008 Mensagens: 4899 Localização: Maringá
|
Enviada: Sex Dez 21, 2012 10:28 pm Assunto: |
|
|
E se você utilizar o trio sugerido pelo johnny-walker?
AdoDataset + DatasetProvider + Clientdaset
Mesmo assim cara, eu acho que é a configuração de alguma propriedade. Isso normalmente não acontece. Conforme o johnny-walker disse, é preciso executar um ApplyUpdates para que os dados sejam persistidos no banco.
Não tem nenhum código no evento OnAfterPost ou AfterInsert da Query? |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|