Duvidas de iniciante experiente (Conexoes/Triggers/Store Pro
11/09/2004
0
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
Aldus
Posts
11/09/2004
Afarias
|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+
11/09/2004
Vinicius2k
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.
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.
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.
Sim. Mas ele é o espelho apena do registro atual do CDS, e serve também para ligações do tipo Mestre/Detalhe.
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.
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,
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...
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...
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+
11/09/2004
Aldus
Obrigado e tenham um bom fim de semana.
Atenciosamente
Mario
Clique aqui para fazer login e interagir na Comunidade :)