Array
(
)

Duvidas de iniciante experiente (Conexoes/Triggers/Store Pro

Aldus
   - 11 set 2004

Olá amigos, como o título já diz, sou iniciante em delphi mas a bastante tempo programo em Clipper, então algumas rotinas ainda me parecem estranhas, gostaria de contar com ajuda de vocês para esclarecer alguns tópicos (que infelizmente não são contemplados nos livros) e iniciar com tudo nessa fantástica ferramenta, fora isso, já tenho um contato bastante grande com a ferramenta, os tópicos ficaram grandes, mas é para esplanar bem as dúvidas:

Vou postar o tópico e a minha opinião, se estiver errado, por favor informem:

1)Sqldataset – nele são feitas todas as operações de select, insert, update e delete, é o componente principal para manipular mesmo as informações diretamente no servidor

2)Provider – Serve apenas em conjunto com o clientdataset, para possibilitar acesso bidirecional

3)Clientdataset – serve apenas para navegar pelo registros, é o espelho do conteúdo selecionado no sqldataset, nele os dados ficam em memória no terminal

4)Datasource – serve apenas alimentar componentes tipo dbedit e dbgrid, é o espelho do que contém clientdataset

5)Um exemplo prático de abertura de tabelas: no cadastro de clientes uso um campo cidade, que por sua vez possui um cadastro, então quando crio o cadastro de clientes abro sqldataset de clientes e cidades e clientdataset de clientes e cidades, quando a cidade procurada não está cadastrada clico no botão e abro o form cad cidades, no oncreate dele também abro o seu sqldataset e clientdataset, quando saio no onclose fecho sqldataset e clientdataset, como ficaria o acesso ao cadastro de cidades neste retorno já que a tabela foi fechado, ou trabalham em instâncias diferentes? Como poderia fazer essa chamada ao form cad cidades.

6)Quando quero totalizar as vendas de uma dia, seleciono pelo sqldataset, devo colocar um while para percorrer os registros no clientdataset?

7)É possível e indicado criar um store procedure para baixar estoques? Já que a operação não precisaria ser executada toda vez no terminal. Qual a sintaxe de um store procedure e como chama-la no delphi, é possível passar parâmetro? É possível interromper a execução de uma SP, pois se mando rodar um aumento para 50000 produtos, posso fazer através de SP? Posso usar barra de progresso da operação?

8)Através de um trigger posso pegar um novo código, mas é possível descobrir o código vago? Tipo cadastro de produtos tenho os códigos 1 2 3 4 6 7 8 , ele descobrir que o 5 está livre.

Sei que perguntei bastante coisa, mas se puderem me auxiliar, desde agradeço.

Atenciosamente

Mario


Afarias
   - 11 set 2004

|1) Sqldataset – nele são feitas todas as operações de select, insert,
|update e delete, é o componente principal para manipular mesmo as
|informações diretamente no servidor

É... assim como o SQLQuery... e se vai usar em conjunto com um conjunto DataSetProvider/ClientDataSet sua função é apenas selecionar registros.


|2) Provider – Serve apenas em conjunto com o clientdataset, para
|possibilitar acesso bidirecional

o provider tem 2 funções principais::

1- enviar os registros de uma consulta (DataSet) para o buffer de um ClientDataSet

2- realizar as operações de atualização da base de dados (updates, inserts e deletes) baseado no Delta de um ClientDataSet


|3) Clientdataset – serve apenas para navegar pelo registros, é o espelho
|do conteúdo selecionado no sqldataset, nele os dados ficam em memória
|no terminal

É.


|4) Datasource – serve apenas alimentar componentes tipo dbedit e
|dbgrid, é o espelho do que contém clientdataset

nào é um ´espelho´ é apenas um ´link´ para q os controles não sejam amarrados em um DataSet específico.


|quando crio o cadastro de clientes abro sqldataset de clientes e cidades
|e clientdataset de clientes e cidades,

Vc não precisa abrir o SQLDataSet e depois o ClientDataSet -- abra apenas o ClientDataSet e o resto é feito automáticamente.


|quando saio no onclose fecho sqldataset e clientdataset,

Tb só precisa fechar o ClientDataSet -- e, eu não conheço de DBExpress, mas numa configuração DataSet-Provider-ClientDataSet *acho* q é ´melhor´ usar um sqlQuery q sqlDataSet


|6) Quando quero totalizar as vendas de uma dia, seleciono pelo
|sqldataset, devo colocar um while para percorrer os registros no
|clientdataset?

totalize usando SQL ... ex: select sum(campo_tal) from tabela... por ai..


|7) É possível e indicado criar um store procedure para baixar estoques?
|Já que a operação não precisaria ser executada toda vez no terminal.

SIM


|Qual a sintaxe de um store procedure e como chama-la no delphi,

depende (um pouco) do banco de dados q vai utilizar.


|é possível passar parâmetro?

SIM


|É possível interromper a execução de uma SP,

Nem sempre. depende do banco de dados.


|pois se mando rodar um aumento para 50000 produtos, posso fazer
|através de SP?

SIM


|Posso usar barra de progresso da operação?

Usando SQL??? NÃO! (pelo menos não lembro de um SGBD q permita isso)


|8) Através de um trigger posso pegar um novo código, mas é possível
|descobrir o código vago?

não é preciso usar TRIGGERS para isso. mas pode.


|Tipo cadastro de produtos tenho os códigos 1 2 3 4 6 7 8 , ele descobrir
|que o 5 está livre.

isso não existem em bancos de dados relacionais, ou sistemas C/S -- pergunte a si mesmo:: que importância tem isso para o sistema? (NENHUMA!)


T+


Vinicius2k
   - 11 set 2004

Mario,


Citação:
1)Sqldataset – nele são feitas todas as operações de select, insert, update e delete, é o componente principal para manipular mesmo as informações diretamente no servidor

Pode-se dizer que sim, mas não necessariamente todas as operações precisam ser feitas nele. Particularmente, prefiro fazer algumas nele, mas existe um outro caminho que seria através do próprio ClientDataSet.


Citação:
2)Provider – Serve apenas em conjunto com o clientdataset, para possibilitar acesso bidirecional

Sim. Mas o provider é bem mais do que um coadjuvante. Ele é o responsável pela interação entre o ClientDataSet e o SQLDataSet. Quando é executado o método Open do ClientDataSet este repassa a instrução ao Provider que por sua vez irá solicitar os dados ao SQLDataSet. Recebendo estes dados, enviará ao ClientDataSet.


Citação:
3)Clientdataset – serve apenas para navegar pelo registros, é o espelho do conteúdo selecionado no sqldataset, nele os dados ficam em memória no terminal

Não exatamente. A possibilidade de navegação bidirecional é uma consequência da capacidade de armazenamento em buffer dos registros e todas as modificações no conjunto de dados, inclusive inserts e deletes. Todas estas modificações estão armazenadas na propriedade DELTA , e o conteúdo desta propriedade pode ser enviada de volta ao Provider para que este interaja novamente com o SQLDataSet, incluindo, editando ou excluindo registros do Banco de Dados. Este re-envio ao Provider é o método ApplyUpdates.
O ClientDataSet permite ainda a utilização da propriedade ´CommandText´ com uma instrução SQL, (é necessário configurar o Provider para aceitar CommandTexts vindos do CDS => poAllowCommandText = True), e isto permite que a ´verdadeira´ CommandText do SQLDataSet fique vazia, e ele deixaria de ser o ´ator principal´ e passaria a coadjuvante, apenas recebendo ordens do Provider.



Citação:
4)Datasource – serve apenas alimentar componentes tipo dbedit e dbgrid, é o espelho do que contém clientdataset

Sim. Mas ele é o espelho apena do registro atual do CDS, e serve também para ligações do tipo Mestre/Detalhe.


Citação:
5)Um exemplo prático de abertura de tabelas: no cadastro de clientes uso um campo cidade, que por sua vez possui um cadastro, então quando crio o cadastro de clientes abro sqldataset de clientes e cidades e clientdataset de clientes e cidades, quando a cidade procurada não está cadastrada clico no botão e abro o form cad cidades, no oncreate dele também abro o seu sqldataset e clientdataset, quando saio no onclose fecho sqldataset e clientdataset, como ficaria o acesso ao cadastro de cidades neste retorno já que a tabela foi fechado, ou trabalham em instâncias diferentes? Como poderia fazer essa chamada ao form cad cidades.

Vamos por partes :
1. Vc deve esquecer o termo ´Tabelas´... vc não está abrindo tabelas, está executando queries. Este conceito é importante para que vc perceba a independencia entre os processos.
2. Nunca execute o Open ou o Close de um SQLDataSet que tem um ClientDataSet ligado a ele. Existe um re-trabalho neste caso. Já que o Open do ClientDataSet já irá solicitar o Provider o Open e fecth dos registros do SQLDataSet.
3. O aspecto de fechar e abrir depende de onde estão os componentes de acesso... se estiverem nos próprios forms, não existe relação entre eles, são totalmente independentes, mas se estiverem num DataModule, fechar o CDS de cidades vai influenciar na operação anterior, já que seriam compartilhados entre os forms.


Citação:
6)Quando quero totalizar as vendas de uma dia, seleciono pelo sqldataset, devo colocar um while para percorrer os registros no clientdataset?

Não. De jeito nenhum. Varrer todos os registros para somar um campo, usando um SGBD é, no mínimo, suicídio. Execute uma query, tipo,
#Código

select sum(VALOR) as TOTAL from PEDIDOS where DATAPEDIDO = 11/09/2004

Não dá nem para comparar a diferença de performance que vc teria...



Citação:
7)É possível e indicado criar um store procedure para baixar estoques? Já que a operação não precisaria ser executada toda vez no terminal. Qual a sintaxe de um store procedure e como chama-la no delphi, é possível passar parâmetro? É possível interromper a execução de uma SP, pois se mando rodar um aumento para 50000 produtos, posso fazer através de SP? Posso usar barra de progresso da operação?

Quanto a SPs não posso lhe ajudar muito pq não conheço muita coisa... eu, particularmente não uso ainda, por falta de conhecimento, mas...
Sim, vc pode passar parametros, utilizaria o SQLStoredProc para executar e o processamento é mais rápido.
Não, vc não pode interromper e, creio que não possa acompanhar o processamento com uma barra de progresso...
Para baixa de estoque ou outras operações pequenas, costumo usar triggers...
Acho q seria muito difícil alguém lhe explicar tudo sobre triggers e SPs, vc teria que procurar documentação e estudá-las um pouco... o assunto é muito extenso e eu ainda estou aprendendendo...



Citação:
8 )Através de um trigger posso pegar um novo código, mas é possível descobrir o código vago? Tipo cadastro de produtos tenho os códigos 1 2 3 4 6 7 8 , ele descobrir que o 5 está livre.

Isso eu nunca tentei... talvez seja possível, mas creio que pouco útil... vc pode programar triggers para executar instruções SQL e guardar o resultado de um select numa variável local da própria trigger, o que vc teria q desenvolver é a instrução SQL que lhe retornasse este resultado (código livre)...

Bem, do pouco q eu sei, creio que é isto... se permanecer alguma dúvida e eu puder ajudar, conte comigo e com certeza, com toda a comunidade...

T+


Aldus
   - 11 set 2004

Vinicius e Farias, muito obrigado pelo tempo dedicado e pelas esclarecedoras respostas, com base nelas já pude formalizar e identificar maneiras erradas que eu tinha sobre o funcionamento deste modelo.

Obrigado e tenham um bom fim de semana.

Atenciosamente

Mario