Escolar Documentos
Profissional Documentos
Cultura Documentos
Editorial
Enquanto isso, aproveite a revista desde mês, onde temos vários
THE CLUB artigos interessantes! Iniciamos uma série sobre UML, uma linguagem
Rua Acre, 950 - Avaré - SP - CEP 18.700-260
Informações: (0xx14) 3732-3689
de modelagem estruturada que esta se tornando um padrâo mundial na
Suporte: (0xx14) 3733-1588 metodologia da Engenharia de Software. Temos também, um ótimo
Fax: (0xx14) 3732-0987 artigo sobre WebServices, pois hoje, não dá para falar em internet sem
falar em WebServices...
Internet
http://www.theclub.com.br Na série DataSnap, é demonstrado de forma bastante simples o
Cadastro: cadastro@theclub.com.br temido Master/Detail, provando não ser tão difícil assim!
Suporte: suporte@theclub.com.br
Informações: info@theclub.com.br E finalizando, temos dois artigos sobre banco de dados, um sobre
Oracle e outro demonstrando a facilidade na utilização dos Domains no
Dúvidas Firebird.
Correspondência ou fax com dúvidas devem ser
enviados ao - THE CLUB, indicando "Suporte".
Aproveite!
Opinião
Se você quer dar a sua opinião sobre o clube em
geral, mande a sua correspondência para a seção Feliz Natal e próspero ano novo!
"Tire sua dúvida".
Reprodução
A utilização, reprodução, apropriação,
armazenamento em banco de dados, sob qualquer
forma ou meio, de textos, fotos e outras criações
intelectuais em cada publicação da Revista
“The Club” são terminantemente proibidos sem
autorização escrita dos titulares dos direitos
autorais.
Editorial ...................................................................................... 03
Diretor - Presidente
MeGAZINE 3
NEWS
4 MeGAZINE
Delphi
UML
Linguagem de Modelagem Unificada
Orientação à Objeto na Modelagem
As empresas cada vez mais estão voltadas às Ela é utilizada para descrever pontos de um sistema e da
informações.Com isso, o volume de informações vem crescendo forma como ele é percebido de várias visões durante a análise e
exageradamente e nem sempre podemos retirar vantagens sua arquitetura.
competitivas devido à falta de uniformidade com que elas são É uma linguagem que visa capturar conhecimento e
postadas. expressar esse conhecimento.
O desenvolvimento de sistemas deve acompanhar a mutação Seu propósito é a modelagem de sistemas, documentar de
constante das informações e para isso, devemos construir maneira interativa e visual, proporcionar melhor compreensão e
aplicações mais flexíveis e com menor taxa de manutenção. sinergia entre o analista e o cliente envolvido no processo de
Para que isso ocorra, é necessário adotar uma metodologia de desenvolvimento.
trabalho que se aproxime mais da realidade da empresa, que
consiga descrever seus fluxos operacionais e trâmite dos negócios, Devemos adotar a UML?
retratando de fato toda a sua concepção. Além da sua alta e rápida adesão no mercado mundial, aqui
É percebível por todos que os métodos de modelagem no Brasil, sempre tivemos a grande necessidade da adoção de um
tradicionais, especificamente o modelo estruturado, tornam o modelo mais eficiente e que resultasse maior produtividade,
desenvolvimento mais demorado, custos de manutenção maiores menos erros no desenvolvimento, encurtamento dos prazos de
e em casos mais caóticos, levam o projeto a naufragar. entrega, menor custo de manutenção do software.
Isso porque existe uma dificuldade enorme em extrair do Falando assim, parece a solução que todos esperaram por
cliente a verdadeira necessidade da empresa e principalmente as anos, mas também não é bem assim.Os resultados aparecem, se
expectativas que estão focadas encima daquele desenvolvimento. bem utilizados os recursos disponíveis e a perfeita compreensão
Por este motivo, o contato humano e habilidade de entrevistar dos conceitos da orientação à objetos que se pretende
o cliente, já não é mais eficiente, necessitando de apoio de uma sensibilizar.Caso contrário será mais um método que tentaremos
ferramenta que possa de alguma forma, colaborar utilizar e os resultados não virão.Abandonar os atuais métodos
metodicamente para que as informações venham condizer com a que você utiliza pode ser catastrófico.Afinal, muitos projetos
empresa e os requisitos que o analista de sistemas necessita para foram bem sucedidos, apesar das estatísticas serem bastante
o desenvolvimento, bem como atender as necessidades do cliente e assustadoras, quando institutos americanos respeitados,
resultar em algo mais nas estratégias de negócios. afirmam que 60% dos sistemas começados, não chegam a ser
finalizados, e muito menos a serem utilizados.
Onde entra a UML ? Desenvolvemos sistemas que enfocam demandas e requisitos
A UML é uma linguagem de modelagem, totalmente de clientes.
orientada à objetos, que une as melhores práticas e metodologias Requisitos são considerados os problemas.Os sistemas são
da Engenharia de Software. considerados a solução.O problema e a solução ocorrem dentro de
É considerada a sintaxe geral para criar um modelo lógico de um mesmo contexto.
um sistema. Para ser desenvolvida uma boa solução, primeiramente deve
MeGAZINE 5
Delphi
existir compreensão do problema.A solução deve ser entendida Adotando a UML para os novos projetos, explorando e
para que possa ser criada e utilizada. utilizando todos os seus recursos e juntamente com uma
Partindo deste princípio, a solução deve ser arquitetada, a fim ferramenta para modelar os dados é o primeiro grande passo.
de aderir às restrições de suas necessidades. A ferramenta mais conhecida para a utilização da UML é da
Para adotarmos a solução apropriada ao problema, precisamos empresa Rational, e chama-se Rational Rose.A Borland,
modelar, organizar, e representar através de diagramas, onde percebendo a evolução global da UML, incluiu somente na versão
permitirão comunicação e disseminação dos conhecimentos Enterprise do Delphi 7, o ModelMaker, ferramenta muito similar
extraídos ao Rational Rose, capaz de modelar o projeto utilizando UML e já
. gerar código no Delphi.
Que tipos de diagramas são utilizados? Utilizar metodologias de modelagem de sistemas que de
Na UML podemos utilizar vários diagramas para melhor alguma forma vão melhorar nosso desempenho e resultados, o
compreender a complexidade de nosso problema explorando ao desafio é grande, no entanto o objetivo, é atenuar ao máximo os
máximo todo o conceito de orientação a objeto.Entre eles podemos desperdícios de tempo e de recursos financeiros empregados em
destacar: projetos de sistemas.
• Diagramas de casos de uso A cada artigo mensal, demonstraremos a utilização de cada
• Diagramas de objeto diagrama e posteriormente a sua utilização na ferramenta de
• Diagramas de classe modelagem UML. Acompanhe!
• Diagramas de seqüência Sobre o autor
• Diagramas de colaboração
• Diagramas de estado Marcelo Nogueira é Analista de Sistemas,
• Diagramas de atividade Instrutor e Desenvolvedor Delphi, na SoftWay
• Diagramas de componentes Informática, Santos - SP.
• Diagramas de Implantação e-mail: softway@iron.com.br
6 MeGAZINE
Delphi
WebService Exemplo
MeGAZINE 7
Delphi
Projeto ws1.dpr
Figura: 6 WebModule1
8 MeGAZINE
Delphi
MeGAZINE 9
Delphi
Digite: http://localhost/cgi-bin/ws1.exe/
Passando pelo bloco das definições inicias (<?xml
version=”1.0"...), chegamos no bloco de definições de tipos e
A figura 8 ilustra o resultado da primeira fase de nossa
métodos.
aplicação.
Neste bloco são definidos todos os métodos da nossa Interface,
com o descritivo completo. Repare que a classe TEnumTest é
Repare que temos todos os métodos listados na Interface
descrita com perfeição.
Iwsexemplo (echoEnum, echoDoubleArray, echoMyEmployee,
echoDouble).
No bloco que segue, são descritos os métodos Request e Response
da Interface em questão.
O documento gerado está de acordo com o padrão estabelecido
pelo W3C-UDDI (órgão responsável pelo padrão WebService).
- <message name=”echoEnum0Request”>
<part name=”Value” type=”ns1:TEnumTest” />
Clicando no link WSDL da Interface Iwexemplo será apresentado
</message>
um documento WSDL.
- <message name=”echoEnum0Response”>
<part name=”return” type=”ns1:TEnumTest” />
Vamos analisar algumas partes do documento para
</message>
compreender melhor seu funcionamento.
10 MeGAZINE
Delphi
A seguir, temos o bloco que define o nome da porta (Port), e Unit un_teste_ws1.PAS
as operações Request e Response, descritas no bloco anterior.
Projeto teste_ws1.DPR
- <portType name=”Iwsexemplo”>
- <operation name=”echoEnum”> Agora vamos importar a Interface em nossa aplicação. Através
<input message=”tns:echoEnum0Request” /> das opções File/New.../WebServices (figura 9), selecione a opção WSDL
<output message=”tns:echoEnum0Response” /> Importer.
</operation>
- <binding name=”Iwsexemplobinding”
type=”tns:Iwsexemplo”>
<soap:binding style=”rpc” transport=
”http://schemas.xmlsoap.org/soap/http” />
- <operation name=”echoEnum”>
<soap:operation soapAction=
”urn:wsexemploIntf-Iwsexemplo#echoEnum”
style=”rpc” />
- <input message=”tns:echoEnum0Request”>
<soap:body use=”encoded” encodingStyle=
”http://schemas.xmlsoap.org/soap/encoding/”
namespace=”urn:wsexemploIntf-Iwsexemplo” />
</input> Figura 9: WSDL importer
- <output message=”tns:echoEnum0Response”>
<soap:body use=”encoded” Em seguida, como ilustra a figura 10 , digite endereço que
encodingStyle= segue.
”http://schemas.xmlsoap.org/soap/
encoding/”namespace= http://localhost/cgi-bin/ws1.exe/wsdl/Iwsexemplo
”urn:wsexemploIntf-Iwsexemplo” />
</output> Este endereço faz a chamada ao documento WSDL da Interface
Iwsexemplo.
O último bloco finaliza o documento, declarando o nome do
serviço, bem como o nome da porta e a sua camada de transporte.
- <service name=”Iwsexemploservice”>
- <port name=”IwsexemploPort”
binding=”tns:Iwsexemplobinding”>
<soap:address location=”http://localhost/delphi/
cgi-bin/ws1.exe/soap/Iwsexemplo” />
</port>
</service>
</definitions>
MeGAZINE 11
Delphi
implementation
uses Iwsexemplo1;
12 MeGAZINE
Delphi
var
Iexemplo: Iwsexemplo;
begin
Iexemplo:= HR1 as Iwsexemplo;
lbResultado.Caption:=FloattoStr(Iexemplo.echoDouble Figura 13: Aplicação em tempo de execução
(StrtoFloat(edValor.Text)));
end; Perceba que a primeira vez que pressionamos o botão, existe
um delay, que é justamente o tempo de conexão com o WebService.
O código é bastante simples, onde estamos definindo um Repita a operação, e repare que já não existe mais o delay.
objeto do tipo Iwsexemplo. Em seguida estamos instanciando o
objeto a partir do nosso HTTPRio (HR1), adotando o modelo Amigos isto é apenas o começo. Em meu livro Delphi 7
Iwsexemplo. E por fim, apresentamos o resultado em nosso objeto Internet e Banco de Dados, explico através de exemplos práticos
lbResultado, através da função IExemplo.echoDouble. todo o poder dos WebServices. Temos WebServices utilizando banco de
dados como serviço, e também conexões concorrentes utilizando o
O mais importante até aqui, é justamente a compreensão de protocolo SOAP.
como conseguimos implementar o WebService em nossa aplicação. Forte abraço e imenso sucesso a todos !!!
Sobre o autor
Vamos testar nossa aplicação.
Emerson Facunte é Consultor de Tecnologia com diversos
Compile e execute a aplicação, informando um número no livros publicados, especialista em desenvolvimento de
campo e pressionando o botão. A figura 13 ilustra nossa aplicação aplicações e-Business utilizando a ferramenta Delphi, baseado
em tempo de execução. em WebSnap, DataSnap, BizSnap e ISAPI/Apache Modules.
MeGAZINE 13
Delphi
Vamos lá então, continuar nossa instalação de uma instance que for utilizado.
Oracle !
Recomendamos, para instalações típicas, utilizar 70% da
Nesta próxima fase da instalação, teremos que definir memória disponível no servidor.
aspectos importantes de nossa instalação. (ver figura 1)
Com essa opção pelo gerenciamento automático, a própria
Um primeiro aspecto é a maneira como a instance irá tratar instance “resolverá” necessidades de alocação para
o gerenciamento de memória, principalmente para a SGA shared_pool_size, db_block_buffers, etc, limitada obviamente à
(System Global Área), uma alocação de memória onde quantidade física de memória. O desempenho da instance sobe
praticamente todas as tarefas do banco são executadas. consideravelmente com a opção pelo gerenciamento automático
de memória.
A partir do Oracle 9i essa configuração, que antes era A partir do 9i você pode utilizar até 4GB de RAM para
obrigatoriamente manual através de parâmetros configurados no ambientes Windows. (ver figura 2)
init.ora, pode ser definida como automática, bastando para isso Uma outra definição importante se refere ao conjunto de
você escolher a opção “Típico” e definir qual percentual da caracteres que você vai utilizar na instance. Prefira, para o
memória do servidor irá ser disponibilizada para o Oracle. Brasil, o conjunto WE8ISO8859P1, que oferece total
compatibilidade com instalações típicas de versões anteriores e
É importante considerar que nem toda memória pode ser com conjunto de caracteres “asc ii”, que contém acentuação,
disponibilizada, mesmo que no servidor rode apenas o banco de cedilha, etc...(ver figura 3)
dados (o que é altamente recomendável), pois existem processos
importantes do sistema operacional que precisam ser Para o parâmetro sort_área_size, chamado dimensionamento
considerados. para área de classificação, o número padrão de 524288 bytes é
uma excelente escolha para a maioria das instalações.
Se você precisar instalar outras funcionalidades corporativas,
como servidor de Internet, servidor de email, firewall, servidor de Vale lembrar que essa alocação não faz parte da SGA, e será
anti-vírus, etc, tenha em mente prioritariamente utilizar multiplicada pelo número de usuários conectados à instance, isto
servidores separados para cada função, em grau a ser definido é, para cada conexão neste caso a instance reservará 524288
segundo o porte da empresa e das aplicações que irão rodar. O bytes.
importante é que no servidor Oracle não tenhamos mais
aplicações rodando! Se a sua empresa tiver uma base muito Esse parâmetro, que define o quanto de memória cada sessão
pequena, talvez você consiga obter resultados satisfatórios com terá disponível para efetivar tarefas como “sort”, é fundamental
“tudo instalado no mesmo servidor”. para o desempenho. Alocações baixas serão sentidas
sensivelmente pelos usuários. (ver figura 4)
É importante ainda ressaltar que esse conceito não vale
apenas para Oracle, mas para qualquer banco de dados Em localização dos arquivos, defina sempre como necessária
relacional competente (Oracle, SQL Server, Sybase, Informix) a criação de arquivo de parâmetros (SPFILE), que é uma
14 MeGAZINE
Delphi
Figura 1 Figura 4
Figura 2 Figura 5
Sobre o autor
evolução do init.ora, do qual falaremos no futuro. Com essa
opção, o init.ora perde muito de sua importância e, o que é Mário Camilo Bohm - Bohm,Interal
melhor, para praticamente todos os parâmetros de inicialização Fone (011) 4223.9911
não será mais necessário re-iniciar a instance em casos de mario@bohminteral.com.br
alteração. Em outras palavras, você modifica os parâmetros da http://www.bohminteral.com.br
instance sem tirar a instance do ar !
MeGAZINE 15
Delphi
DataSnap
Parte VII - O Cliente COM+ - Master/Detail
16 MeGAZINE
Delphi
ALTER TABLE TAB_PARCEIROS_CONT ADD Com a união (uses) dos dois RDMs podemos enxergar o
CONSTRAINT FK_1014_1013 FOREIGN KEY (ID_PARC) SQLConnection que se encontra no RDMConexao, e ligar a
REFERENCES TAB_PARCEIROS (ID_PARC) ON DELETE propriedade SQLConnection de todos os SQLDataSet´s igual a:
CASCADE; Server_COMPlus.SQLCnctnBASE. Ok.
MeGAZINE 17
Delphi
18 MeGAZINE
Delphi
Nos falta ligarmos os DataSources aos seus respectivos O RDM que acabamos de criar está pronto (nos falta uma
SQLDataSets para criarmos os relacionamentos. O Componente regra que escreveremos mais adiante para a manutenção correta
SQLDtStTAB_PARCEIROS_CONT deve ter sua propriedade dos registros Master/Detail).
DataSource igual a: DtSrcTAB_PARCEIROS_CONT, o
Componente SQLDtStTAB_PARCEIROS_REFER_C deve ter sua Devemos Salvar tudo!
propriedade DataSource igual a:
DtSrcTAB_PARCEIROS_REFER_C e o Componente Devemos abrir o nosso RDMConexao, ALT+F11 e devemos
SQLDtStTAB_PARCEIROS_REFER_B deve ter sua propriedade escolher: RDMCadParceiros.
DataSource igual a: DtSrcTAB_PARCEIROS_REFER_B. Agora,
temos o relacionamento completo. Vamos agora, fazer a ligação das Interfaces de RDMParceiros
com o RDMConexao e vice-versa, através da Type Library (TLB).
O RDM que acabamos de criar deve o seguinte Layout, View|Type Library, devemos ter a seguinte TLB inicial, Figura
Figura (6): (7):
Figura 7: A
Type Library
atual.
MeGAZINE 19
Delphi
Devemos criar uma nova Interface com o name de: RDMCadParceiros tem uma nova function e uma nova
IChildCadParceiros, vamos criar duas propriedades, uma Read- procedure.
Only e outra Write-Only, com o name de: RDMCadParceiros, a
propriedade Read-Only deve ter o seu Type igual a: Antes vamos criar a variável: FIServer_COMPlus:
IServer_COMPlus*, ficando igual a: struct tag IServer_COMPlus IServer_COMPlus, na seção private.
*. IChildCadParceiros deve ter seu Parent Interface igual a:
IAppServer. A Interface IRDMParceiros deve ter o seu Parent A function Get_RDMCadParceiros: IServer_COMPlus;
Interface igual a: IChildCadParceiros. safecall; deve ter a seguinte codificação: Result :=
FIServer_COMPlus, é claro entre o begin e end;, a procedure
Vamos agora criar uma nova propriedade Read-Only na Set_RDMCadParceiros(const Value: IServer_COMPlus); safecall;,
Interface IServer_COMPlus, com o name igual a: deve ter a seguinte codificação: FIServer_COMPlus := Value;, a
RDMCadParceiros, seu Type deve ser igual a: IRDMParceiros*, seção initialization, deve-se ter o seguinte código:
ficando igual a: struct tag IRDMParceiros *. Antes de fecharmos RDMCadParceirosFactory :=
a Type Library, vamos escolher todas as CoClass ( ), ir até a TComponentFactory.Create(ComServer,
Guia COM+, colocar os seguintes valores e parâmetros: Marcar TRDMParceiros,Class_RDMParceiros, ciMultiInstance,
Object Pooling, Creation Timeout=10000, Call tmBoth);. Em RDMConexao devemos ter o seguinte código na
Syncronatization=Required e Transaction Model=Requires a function Get_RDMCadParceiros: IRDMParceiros; safecall;
new transaction, devendo todas as CoClass ficarem com os Result := RDMCadParceirosFactory.CreateCOMObject(nil)
seguintes parâmetros, Figura (8): as IRDMParceiros;
20 MeGAZINE
Delphi
Você verá que, o Delphi trata quase tudo internamente para A propriedade Name do SharedConnection deve ser igual a:
nós, não necessitamos de quase nenhuma linha de programação ShrdCnctnParceiros, e seu ChildName igual a:
para montar o nosso Master/Detail. RDMCadParceiros.
Se a mesma não aparecer na lista, reveja as ligações feitas na
E afirmo que você pode confiar no mecanismo do Delphi para Type Library, ParentConnection deve ser igual a:
tal tarefa, até o momento não tive problemas com essa estrutura, DMConexao.DCOMCnctnConexao.
e já criei alguns Master´s/Detail´s dentro do meu sistema.
A propriedade Name do ConnectionBroker deve ser igual a:
Mãos a Obra! CnctnBrkrParceiros, Connection deve ser igual a:
ShrdCnctnParceiros (O SharedConnection que se encontra no
Vamos criar um novo FORM no Delphi. Já vamos salvar o Formulário).
mesmo com o seguinte nome: uFrmParceiros.pas no diretório do
projeto Cliente, isto é, em: C:\DataSnap\Cliente. A propriedade Name do ClientDataSet1 deve ser igual a:
ClntDtStTAB_PARC, ConnectionBroker deve ser igual a:
O name do nosso Formulário deve ser igual: FrmParceiros, e CnctnBrkrParceiros (O ConnectionBroker que se encontra no
seu Caption igual a: Cadastro de Parceiros. Já temos o nosso Formulário) e ProviderName deve ser igual a:
FORM pronto para colocarmos os componentes necessários para DtStPrvdrParceiros, o mesmo deve aparecer na lista se todas as
criarmos o nosso cadastro Master/Detail. ALT+F11 e devemos ligações feitas na Type Library estão corretas.
escolher: uDMConexao, Salve Tudo ( )!
Duplo click para editar os TFields, e peça para incluir todos os
Vamos colocar os seguintes componentes no formulário: campos, após isso devemos ter a seguinte Figura (9):
MeGAZINE 21
Delphi
DataSetField não é um conceito novo, já existia antes da Devemos apenas ligar os Grids aos seus respectivos
chegada da dbExpress, mas, está se tornando quase que DataSources:
obrigatório o uso do mesmo. DBGrid1 seu name= DBGrdTAB_PARC_CONT e seu
DataSource= DtSrcTAB_PARC_CONT - DBGrid2 seu name=
Quando criamos um relacionamento em DataSet´s no DBGrdTAB_PARC_REFER_C e seu DataSource=
Servidor de Aplicação e exportamos o DataSet através do DtSrcTAB_PARC_REFER_C - DBGrid3 seu name=
DataSetProvider, o Delphi cria este novo tipo de Coluna, para DBGrdTAB_PARC_REFER_B e seu DataSource=
facilitar a nossa vida. DtSrcTAB_PARC_REFER_B.
Esta nova Coluna é criada no DataSet Master e representa Também vamos colocar o name do DBNavigator1=
todas as linhas do Detalhe para apenas uma linha do Master. DBNvgtrTAB_PARC e seu DataSource= DtSrcTAB_PARC.
É através dos DataSetFields que ligaremos os E por último, ligar os DBEdits ao DataSource:
ClientDataSet´s que se encontram no Formulário. DtSrcTAB_PARC e ligar os mesmos as suas respectivas colunas.
Para colocarmos os DBEdits, devemos executar um Duplo Após tudo isso, nos falta apenas modificar os names dos
Click no ClientDataSet- ClntDtStTAB_PARC e arrastar os Buttons:
TFields criados, mas, deixaremos de fora as Colunas Button1 = BtnAtualizar;
DataSetField. Button2 = BtnCancelar;
DataSource1 deve ter o seu name alterado para: Devemos ter a seguinte tela, Figura (10) e Figura (11):
22 MeGAZINE
Delphi
MeGAZINE 23
Delphi
Listagem 3: Indicando a referência do formulário para A ajuda na gravação dos dados no Delta. O por que dessa
nil. ajuda eu expliquei na Parte VI.
Devemos ter o seguinte código para o botão - Atualizar - Da mesma forma, devemos proceder para os outros três
Enviar para o Servidor, Listagem 4: ClientDataSets. Como eu utilizei o mesmo nome de Coluna para
a Chave Primária (como sempre faço, PK tem o nome da coluna
procedure TFrmParceiros.BtnAtualizarClick sempre de “ID”, salvo alguns casos, onde necessito de Master/
(Sender: TObject); Detail), posso implementar apenas um evento para os três
begin ClientDataSets. No Evento BeforePost() do
ClntDtStTAB_PARC.ApplyUpdates(0); ClntDtStTAB_PARC_CONT devemos ter o seguinte código,
end; Listagem 7:
24 MeGAZINE
Delphi
DataSet.FieldByName(‘ID’).AsInteger := 0; DeltaDS.FieldByName(‘ID’).NewValue :=
end; FIServer_COMPlus.AutoIncremento(‘TAB_PARCEIROS_REFER’,’ID’);
DeltaDS.FieldByName(‘TP_REF’).NewValue := ‘C’
Listagem 7: Novamente a “Ajuda” para o Delphi gravar sem end
erros a atualização Local, neste caso, para os Detalhes. else if SourceDS = SQLDtStTAB_PARCEIROS_REFER_B
then
Agora devemos ligar o evento BeforePost() de
ClntDtStTAB_PARC_REF_C e ClntDtStTAB_PARC_REF_B, begin
para o mesmo evento de ClntDtStTAB_PARC_CONT. DeltaDS.FieldByName(‘ID_PARC’).NewValue :=
DeltaDS.DataSetField.DataSet.FieldByName(‘ID_PARC’).AsInteger;
É necessário apenas uma chamada do ApplyUpdates() para DeltaDS.FieldByName(‘ID’).NewValue :=
as tabelas envolvidas em Master/Detail e ligadas através de FIServer_COMPlus.AutoIncremento(‘TAB_PARCEIROS_REFER’,’ID’);
DataSetFields. DeltaDS.FieldByName(‘TP_REF’).NewValue := ‘B’;
end;
Server COM+ end;
Mais uma vez o vai e volta de “lados”. Necessitamos apenas end;
programar o evento BeforeUpdateRecord do DataSetProvider que
se encontra em: RDMParceiros, Listagem 8: Listagem 8: A regra de negócios Master/Detail.
MeGAZINE 25
Delphi
26 MeGAZINE
Coluna do Alexandre Magno
O que são domínios? Veja no Capítulo 5 do manual Data Definition Guide a sintaxe
completa da instrução CREATE DOMAIN.
Um domínio é um template de definições de colunas. Quando O nome do domínio deve ser único em todo o banco de dados e
você define uma tabela, você pode especificar o tipo de dado, valor o tipo de dado deve ser um dos que foram vistos na seção
“default”, character set, null constraints e check constraints para anterior. Por exemplo:
cada coluna individualmente, ou você pode informar que esta
coluna deve ser definida por um domínio previamente criado com CREATE DOMAIN Cidade AS VARCHAR(15);
todas as informações necessárias. Domínios são usualmente Em adicional, você pode especificar as seguintes opções –
definidos antes da criação das tabelas, para que você possa nesta ordem – na parte de definição do domínio:
utilizá-los na definição destas tabelas.
Use domínio para tipos de colunas que estejam presentes em • O parâmetro DEFAULT
várias tabelas do seu banco de dados para tornar fácil a
passagem de parâmetros para estas colunas. Por exemplo, em O parâmetro DEFAULT especifica um valor “padrão” para
um sistema comercial, você deve definir um domínio “CEP” que ser usado se nenhum valor for aplicado. O valor “padrão”
será utilizado nos seguintes lugares: somente é aplicado quando o registro é inserido pela primeira vez
no banco de dados, se você depois remover o valor original, o
• CEP do Cliente; DEFAULT não será inserido. A sintaxe da opção default é:
• CEP do Fabricante;
• CEP da Filial; nome_col DEFAULT [valor_default | NULL | USER]
• CEP do Vendedor;
• entre outras... Colocando USER como valor “default” o Firebird adicionará o
nome do usuário que está conectado em cada nova inserção.
A instrução CREATE DOMAIN DEFAULT geralmente é utilizado nas seguintes situações:
Use esta instrução para criar um novo domínio. Sua sintaxe
básica é a seguinte: • Para colunas caractere, você pode precisar indicar um valor
“default” explicitamente, ou use NULL para especificar um valor
CREATE DOMAIN domain_name AS datatype; nulo, ou use USER para especificar o valor do USER NAME
MeGAZINE 27
Coluna do Alexandre Magno
Expressão Descrição
CREATE DOMAIN DataCadastro AS DATE
DEFAULT ‘Today’;
= value Igual a
Quando você usa um domínio na definição de uma tabela, o >= value Maior ou igual a
valor DEFAULT pode ser sobrescrito por uma nova condição.
!< value Não menor que
Este parâmetro força que um valor seja armazenado na <> value Diferente de
coluna. Ele é muito similar à opção REQUIRED encontrada em
alguns bancos de dados de PC, como o Paradox. != value Não igual a
O parâmetro NOT NULL é testado sempre que o registro é BETWEEN value AND value Entre a faixa de valores passada
gravado no banco de dados, e também nas operações de inserção
e atualização. LIKE value Use '%' para 0 ou mais caracteres
Use '_' para 1 único caractere
CHECK testa o valor inserido dentro da coluna definida pelo IS NOT NULL Testa se o valor é não nulo
domínio para verificar se este valor satisfaz as condições da
expressão. Para definições de domínio, restrições CHECK são CONTAINING value Procura em string case insensitive
limitadas à comparação com um valor ou uma lista de valores, e
somente uma restrição CHECK é permitida. Quando você define STARTING WITH value Procura em string case sensitive
28 MeGAZINE
Coluna do Alexandre Magno
Argos Tecnologia Ltda - Av. Almte. Wandenkolk, nº 811, sala 1003, Umarizal - Belém / PA
Fones: (91) 222-6578 - http://www.argostecnologia.com/clxpert/
MeGAZINE 29
Perguntas & Respostas
Perguntas &
Respostas
Pergunta: Como fazer o componente SQLConection receber Pergunta: Criei uma aplicação usando o IntraWeb e preciso
as configurações de um arquivo INI que eu criei? Eu vi que que ao ser executado seja carregado um arquivo INI que
existe uma propriedade LoadFromFileIni mas como usá-la? configura o acesso ao Oracle. Este arquivo INI está junto a
aplicação no servidor.
Resposta: Para passar as configurações para o Tentei:
sqlConnection, primeiro crie um arquivo INI contendo os WebApplication.GetNamePath;
parâmetros necessários para a conexão: WebApplication.UrlBase;
WebApplication.IP;
[MINHA_CONEXAO]
DriverName=Interbase Nenhum funcionou a contento. A forma que consegui foi usando
BlobSize=-1 o caminho dentro da aplicação:
CommitRetain=False vCaminho := ‘c:\inetpub\wwwroot\Isapi\MeuArq.INI’;
Database=192.168.0.1:C:\PASTA\ARQUIVO.GDB Mas preciso de algo dinâmico. Vocês tem alguma solução para o
ErrorResourceFile= problema?
LocaleCode=0000 Resposta: Existe uma variável de ambiente no Intraweb que
Password=masterkey retorna o path físico onde a aplicação está rodando, veja o código
RoleName=RoleName abaixo:
ServerCharSet=
SQLDialect=3 uses
Interbase TransIsolation=ReadCommited SWSystem;
User_Name=sysdba procedure TformMain.IWButton1Click(Sender: TObject);
WaitOnLocks=True begin
IWEdit1.Text := gsAppPath; // retorna o path
A propriedade “LoadParamsOnConnect” deve estar “False”; end;
Importante: As propriedades abaixo devem estar Dúvida enviada Nirlan E. Fundão, São Mateus/ES.
preenchidas:
Pergunta: Estou precisando mudar a propriedade
GetDriverFunc = getSQLDriverINTERBASE DisplayFormat dos TFields de um componente TIBQuery em
LibraryName = dbexpint.dll tempo de execução, para que em uma consulta os dados
VendorLib = GDS32.DLL aparecam formatados. Sendo que a propriedade referida
é somente leitura, gostaria de saber de que forma eu conseguiria
Após isso, para carregar os parâmetros e ativar o realizar esta formatação.
sqlConnection utilize o método abaixo: Resposta: Para fazer este processo basta utilizar a seguinte
instrução:
sqlConnection.LoadParamsFromIniFile(
ExtractFilePath(ParamStr(0)+’Config.Ini’); TFloatField(IBQuery.FieldByName(
sqlConnection.Open; ‘NomeCampo’)).DisplayFormat := ‘###,##0.00’;
Dúvida enviada por Editora Alto Astral, Bauru/SP. Dúvida enviada por Edson Murilo Maestri, Blumenal/SC
30 MeGAZINE