terça-feira, 6 de novembro de 2007

Refresh - Como atualizar os registros da tela

A intenção deste post é mostrar as diferenças entre Record Flush,
Screen Refresh e View Refresh.

Record Flush

O evento interno Record Flush causa a gravação do registro sem sair do
mesmo. Após a execução o ciclo do registro corrente é completado.


Screen Refresh

O evento interno Screen Refresh permite ao desenvolvedor atualizar os
dados da tela. Primeiro, o ciclo do registro em que se está
posicionado é completado (como ocorre no evento Record Flush), Depois
a operação Get Current é realizada para cada registro da tela. Você
deve usar este evento quando desejar atualizar os registros que estão
sendo mostrado na tela. O registro atual não será alterado (exceto
quando outro usuário alterar o registr).


View Refresh

O evento View Refresh permite ao desenvolvedor atualizar os dados da
tela. Primeiro , o ciclo do registro atual é completado (como ocorre
no evento Record Flush). Depois, o dataview é criado baseando-se na
definição do dataview (Range, Locate e Sort). Você deve usar este
evento quando desejar atualizar completamente o dataview. O eDeveloper
irá tentar manter o cursor no mesmo registro posicionado.
Quando usar este evento, se o evento Get Current (posicionar no
registro) falhar, a mensagem "Record is not longer in view" será
mostrada e irá posicionar no próximo registro (baseado na definição do
dataview). A operação Ger Current pode falhar porque outro usuário
pode excluir o registro ou modificá-lo.

Maurício Ouriques

sexta-feira, 24 de agosto de 2007

Configurando eDev10 para usar Web Services


Caso você esteja com problemas em configurar o ambiente eDeveloper 10 para uso de Web Services, segue um roteiro explicando como configurar.
Utilize a versão 1.5.0 do Java JDK.
1. Environment Variables:
When typing "%WASP_HOME%" in "Start->Run" you should navigate to the SSJ directory that was created by eDeveloper 10 installation.
When typing "%JAVA_HOME%" you should navigate to the installed Java directory along side SSJ (if you didn't have Java when installing eDeveloepr) or to another location if Java was installed before eDeveloper, in this case you must make sure you have JDK version 1.5.

2. In the %WASP_HOME%\lib directory you should find many JAR files (among them edevSSJ.jar and edevRequester.jar).

3. After you create the service entry and load it (at the moment you can't reach this) you should have a new JAR file under "Magic directory/SoapClientModules/Service name".


You can identify the JAVA version by opening the "ReadMe.html" file located under your %JAVA_HOME%.

sexta-feira, 17 de agosto de 2007

Magic - Rich Client

A Magic está finalizando um novo método para desenvolvimento de programas que estão chamando de Rich Client. Este novo conceito ainda não está liberado oficialmente mas já está incluso no pacote 10.1 SP3 liberado esta semana, para seu uso é necessário uma nova licença.

Este novo conceito de programação é totalmente voltado para ambiente Web, uma das grandes vantagens é a utilização de computadores com baixa configuração. Mesmo sendo um produto web, será possível utilizar todos os recursos de interface GUI disponíveis atualmente, permitindo uma interação completa com o usuário. Outra vantagem que eles estão anunciando é a execução da ferramenta em vários sistemas operacionais, inclusive em dispositivos móveis.

Falando mais tecnicamente, este novo recurso utiliza uma aplicação JAVA que irá rodar no lado do client, eles prometem uma performance surpreendente. A vantagem será que o usuário não precisa utilizar um navegador web (no browser), a ferramenta utiliza seu próprio mecanismo de navegação.

Falando um pouco mais sobre os recursos de interface, estarão disponíveis os controles tree view, tab control, combo Box, list Box, etc. Teremos integração com menus. Houve uma melhoria considerável no table control para web, permitindo sort, multi marking, resizing columns.

OS recursos não param por ai, o aplicativo poderá executar comandos no S.O. do usuário, também será permitido a integração com ActiveX, manipulação de arquivos e no ambiente do sistema operacional.

Para finalizar, este ambiente rodará em Windows, Linux ou ainda Mac OS, podendo ser utilizado em celulares com Windows Mobile ou CE.

Agora é esperar para ver.


Maurício Ouriques

segunda-feira, 13 de agosto de 2007

eDeveloper 10 SP3

Acaba de ser liberado o novo SP da ferramenta, com grandes melhorias. Veja...

Liberado novo release do eDev 10 SP3

Version Control

Permite trabalhar com aplicativo de controle de versão chamado PushOK

http://www.pushok.com/soft_cvs_proxy.php

http://www.pushok.com/soft_cvs_vsvss.php

Browse Client

Melhorias nos scripts eDevScripts (Browse Client)

Migração

Agora permite migrar parte de uma aplicação v9, como range de programas.

Suporte PDF

O eDev10 agora suporta imprimir diretamente para um arquivo PDF, eliminando a necessidade de configurar uma impressora PDF

Possibilita implementar política de segurança em vários níveis com proteção por senha para impressão, cópia ou anotação.

Arquivo de Segurança

Um novo utilitário chamado MgUsrDmp.exe é instalado na pasta eDeveloper.

Este utilitário permite exportar o arquivo de segurança para um arquivo XML, tornando fácil o acesso e pesquisa as informações do usuário.

Para rodar este utilitário você precisa informar a senha do usuário SUPERVISOR.

Utilitário para extração de String

Um novo utilitário foi desenvolvido para permitir a você extrair frases do seu projeto do arquivo XML.

Este utilitário irá ajudá-lo quando você precisar traduzir o sistema para multi-linguagens.

Este utilitário pode ser executado por ambas as FERRAMENTA (Tools) de menus como um componente.

Gerenciamento de Janelas

A função SetWindowsFocus() foi melhorada para permitir setar o foco em outras janelas que não pertencem ao eDeveloper.

Retorno de valor de Store Procedure para MSSQL

Agora a ferramenta suporta receber o valor de uma SP do MSSQL

Isso pode ser feito escrevendo "? =" no enunciado DSQL ("EXEC ? = proc_name") e receber o retorno na variável virtual do return code do SQL Command.

Utilizando Cursor para MSSQL em Store Procedure

O eDeveloper agora suporta usar cursor para enunciados DSQL que retornam um result set.

Isso pode ser feito adicionando "/*=== CURSOR=Y ===*/" no DSQL.

Suporte a SP no DB2

Agora com suporte as Store Procedures do banco DB2.

sexta-feira, 29 de junho de 2007

Tratamento diferenciado para Verify Error em telas com guias.

Ao tentar acessar campos em uma guia, caso um campo de uma guia anterior gerar um Verify Error, não é possível identificar imediatamente qual é o campo. A solução é forçar a mudança para a guia onde está o campo com tratamento de Verify Error.

Programação: Criar um Block Combine Forward, com a condição que indica o Verify Error, dentro deste bloco deve existir um Update na virtual que controla a guia em Combine Backward e o próprio Verify Error em Combine Forward. Quando ocorrer o erro, o processo do Magic será entrar no Block, passar pelo Update e executar o Verify Error que causa um retorno em Backward para o último campo que pode receber foco, neste retorno que é feito o Update que permite o Magic se posicionar na guia e no campo de onde não se pode passar sem antes resolver o erro apresentado.


terça-feira, 19 de junho de 2007

Instalando o eDeveloper no Win2003SP2

Este post tem como objetivo ajudar os Magicianos a instalar o eDeveloper num servidor Windows 2003 usando o SP2.

Segundo a nave mae, Magic Enterprise, existe um bug no InstallShield, ocasionando um erro ao tentar iniciar a instalação do eDev.

Para contornar este pequeno problema, existem duas soluções.

1a. Baixar a última versão do InstallShield no endereço http://support.installshield.com/kb/files/Q108322/InstallShieldEngineUpdate701.exe

2a. Descompactar o pacote numa pasta e a partir da pasta executar o setup.exe
Para descompatar utilize o comando

EXE_name /extract_all:FOLDERNAME

EX.
eDev101sp2.exe /extrac_all:C:\temp\sp2install

Com isso será criada uma pasta dentro de c:\temp chamada sp2instal, ai é só executar o setup.exe.

T+

domingo, 13 de maio de 2007

Integrações com Google - Geocoding

Agora vamos mostrar como é fácil utilizar a ferramenta eDeveloper com integrações via web utilizando a função HTTPGet. Para começar vamos realizar uma integração com a API do Google que fornece o CEP de um endereço.

Para iniciar, precisamos de um xsd do kml para integrarmos com o serviço do Google. Com o xsd na mão é necesário adicioná-lo ao nosso projeto. Para isso crie um nova linha no repositório de dados, selecione o database de XML e então pressione 'Get Definition'. Informe o caminho onde encontra-se o xsd e confirme. Pronto já temos a estrutura para buscar a informação no Google.


Agora vamos criar o programa que irá buscar na web o CEP de um endereço informado. Para isso crie um novo programa no repositório de programas chamado Geocoding.
Crie uma variável do tipo Blob e altere a propriedade Details.Content para Ansi.

Na guia Logic crie uma linha para o Task Prefix, dentro deste handler adicione o comando Update na variável CEP com a seguinte informação: HttpGet('http://maps.google.com/maps/geo?q=Rua+Saldanha+Marinho+336,+Novo+Hamburgo,+Brazil
&output=xml&key=abcde')
Sendo que
http://maps.google.com/maps/geo? é o site onde irá retornar a informar do CEP
Rua+Saldanha+Marinho+336,+Novo+Hamburgo,+Brazil é o endereço pesquisado, aqui um pequeno deslize do nosso amigo Google, Brasil precisa ser informado com Z :(
&output=xml& é a forma como a informação chega até nós, no caso um xml e finalmente,
key=abcde que é a sua chave de ativação ao serviço, para conseguir esta chave entre neste endereço. Aqui uma dica, o serviço só irá funcionar se você informar uma chave correta.


Com o procedimento acima, acabamos de buscar o CEP do endereço informado, agora basta usufruir desta informação. Vamos criar uma subtask para isso.
No Main Source da task filha vamos informar nosso XML PostalCode , na propriedade deste data source vamos informar em Data.XML Source variable a variável criada na task pai (PostalCode_CEP) e vamos adicionar o segmento (Column) PostalCodeNumber.



Pronto agora basta colocar na tela a informação


Caso queria dar uma espiada no projeto baixe ele aqui.

Este é apenas um pequeno exemplo de como podemos integrar o eDeveloper com serviçõs na web, este mesmo serviço fornece também as coordenadas geogáficas do endereço, basta apenas explorá-lo.

Enjoy :)







domingo, 29 de abril de 2007

eDeveloper - Componentes

Realizando chamadas entre componentes M10

Para quem está usando o eDeveloper 10 tem se confrontado com um grande problema que é a re-chamada entre componetes, ou seja, se tenho um componente A que chama o componente B este não pode chamar o componente A.

Para resolver este "pequeno" impasse seguem algumas dicas de uma solução:


Deve ser criado um Evento Global para que o componente chamado possa devolver um valor, vamos ao passos:

. No projeto A (principal) dentro do Main Program, deve ser criado um Evento Público teclando (CTRL+U) Janela Events (fig1). Conforme a figura, informe um nome para este Evento, crie um parâmetro para receber um valor e adicione o nome publico no nosso exemplo "ChamarPrograma".

. Ainda no Main Program agora devemos criar na Guia Logic o gatilho deste Evento, (CTRL+H) para criar o Event. Na coluna nome pressione F5 para informar o Evento, Type User Event ChamarPrograma. Será solicitado para criar a variável nesta parte do programa. Este recurso é interessante porque a variável estará disponível apenas quando o evento for chamado.

Com isso estamos preparados para receber a informação do componente que estamos chamando.

No projeto B (componente chamado) deve ser criada uma chamada para o Evento Público (fig3) gerado no projeto A.
Dentro de um programa na Guia logic crie um evento conforme a necessidade. dentro deste evento crie uma linha com a operação Raise Event apontando para o Public Event informando o nome deste evento, no nosso caso 'ChamarPrograma'. Na coluna Arguments informe os parâmetros que serão passados para o projeto A.

Com isso estaremos devolvendo ou chamando algum componente do projeto que iniciou a chamada.


Espero que com isso alguns probleminhas sejam resolvidos ;)

quinta-feira, 26 de abril de 2007

Gerenciamento de Dados - E que tal o ambiente multi-usuário?

Quando nós desenvolvemos uma aplicação para uma situação multi-usuário, na qual é possível que dois usuários acessem os mesmos dados ao mesmo tempo, a necessidade de desenvolvimento usando transações é maior.

Vamos dar uma olhada nisto com o mesmo cenário simples. Vamos assumir que Fred quer transferir os últimos $50 de sua conta poupança para sua conta corrente (isso parece familiar?), mas sua esposa Wilma está em outra agencia do banco e está sacando $50 da conta corrente para comprar as verduras da semana.

O que acontece? Neste caso, o cenário não é tão simples como possa parecer:

Fred

Wilma

Lê o total da conta poupança


Subtrai $50 da conta poupança


Lê o total da conta corrente


Soma $50 ao total da conta corrente

Lê o total da conta corrente

Ao mesmo tempo em que Wilma está verificando o saldo atual da conta corrente, a fim de sacar o dinheiro, Fred está depositando dinheiro na conta corrente.

Neste caso, ela provavelmente verá que o dinheiro ainda não foi transferido. Ela então verificará o saldo da conta poupança e o que ela verá? Está vazia (lembre que nós mencionamos que Fred está sacando os últimos $50).

O resultado agora será uma conversa zangada entre o feliz casal.

No mundo das transações, este cenário seria ligeiramente diferente. Quando o processo é executado como uma unidade lógica única, um subproduto útil disto é que quaisquer dados atualizados são bloqueados até que a transação tenha sido concluída.

Neste caso, Wilma ainda provavelmente veria que o dinheiro não teria sido transferido, e quando ela verificasse o saldo da conta poupança, ela veria que o dinheiro ainda está na conta. O telefone tocando para Fred teria um tom diferente.

Deve ser observado que os bloqueios são acumulativos dentro da transação. Por exemplo, depois de atualizar um certo registro (o qual é bloqueado como um resultado), o usuário atualiza um segundo registro. Ambos os registros são parte da transação e serão bloqueados até a transação ser ou aplicada (committed) ou cancelada (rolled back).

Supondo que Wilma decide que ao invés de ligar para Fred, ela vai transferir o dinheiro ela mesma. Mas pelo tempo que isso leva para acontecer, a transação com o Fred tenha sido completada (committed). Agora, neste caso, quando ela tentar verificar o saldo atual da conta poupança, o total já terá sido atualizado. Ela pode agora alegremente sacar o dinheiro da conta corrente.

O que de fato acontece neste caso em particular realmente depende do DBMS usado, mas o propósito aqui é dar uma simples visão das transações.


Fonte: "Data Management.pdf", arquivo acompanha a instalação do eDeveloper 10, em inglês.

Gerenciamento de Dados - Porque nós precisamos de transações?

Cada desenvolvedor de aplicação, tem o mesmo objetivo que é assegurar a integridade da base de dados.

Pode haver problemas se você não usar transações para assegurar a integridade da base de dados e isto pode ser ilustrado pelo seguinte cenário:

Um usuário, chamado Fred, quer transferir $50 de sua conta poupança para sua conta corrente. Neste caso, a matemática é simples:

Poupança = poupança - 50

Conta corrente = conta corrente + 50


O que aconteceria se houvesse uma falha de algum tipo entre as duas operações?

Neste caso, a conta poupança seria subtraída em $50, mas a conta corrente não seria atualizada. Pobre Fred ficou sem os $50 e existe também a questão do fundo perdido. Espere até a auditoria!

Nós podemos dizer que, neste exemplo, a integridade de dados está extrema prejudicada.

Se uma transação tivesse sido usada para assegurar que as duas operações fossem executadas como uma unidade lógica única, então se houvesse uma falha durante a execução deste simples processo, todo o processo teria sido abortado ou voltado ao seu estado inicial (rolled back - na linguagem SQL) e a integridade dos dados estaria preservada.

Assim o dinheiro, nas contas, retornaria ao valor inicial que estavam antes de iniciar a transação.

Aqui, eu deveria também adicionar o obvio: no cenário acima no qual parecem existir apenas duas operações, existiram realmente mais duas operações:

Ler o saldo da conta poupança

Ler o saldo da conta corrente

Isto é, sem considerar as modificações reais ao banco de dados.

Como nós podemos ver o processo aparentemente simples não é tão simples como parece.

Em resumo, desenvolvimento com transações é uma parte necessária de aplicações de dados integrados (data-bound applications).

Fonte: "Data Management.pdf", arquivo acompanha a instalação do eDeveloper 10, em inglês.

Gerenciamento de Dados - O que é uma Transação?

O que são transações? Porque nós precisamos usar transações?

Transações são partes integrantes do desenvolvimento de aplicações de dados integrados (data-bound applications). Uma chave para o desenvolvimento de aplicações no ambiente de base de dados é a habilidade de usar transações de forma otimizada para garantir a integridade de dados.

A palavra “Transação” é usada frequentemente quando falamos em aplicações SQL.
Uma transação é uma parte integral de um processo, contribuindo para a composição da aplicação como um todo, e pode ser definida como:

“... Uma unidade atômica de trabalho consistindo de um conjunto de modificações de dados a qual deve ser aplicada na sua totalidade ou abortada completamente”


Isto quer dizer que ou o processo como um todo é bem sucedido ou o processo todo falha.

Não existe meio termo. Inúmeras operações, tais como: UPDATE, DELETE e INSERT podem criar uma unidade única. Só se todas as operações são bem sucedidas, esta unidade lógica será bem sucedida.


Um processo de transação pode ser todo um processo de negócio lógico ou uma unidade menor que é parte de um processo de negócio lógico.

Fonte: "Data Management.pdf", arquivo acompanha a instalação do eDeveloper 10, em inglês.

Apresentação

Ola Pessoal!

Estamos iniciando este blog com um trabalho de apresentação da documentação referente ao eDeveloper 10, a qual acompanha a instalação do mesmo, porém o documento original é disponibilizado em inglês.

O objetivo deste blog é facilitar a vida dos "magicianos", com a tradução e publicação frequentes dos assuntos abordados nesta documentação, bem como, fornecer informações sobre experiências dos colaboradores no que se refere ao desenvolvimento e ao domínio específico da ferramenta e banco de dados.

Façam um bom uso do material e se sintam à vontade para contribuir sobre os assuntos abordados e assim enriquecer este blog.

Caso alguém tenha alguma documentação sobre os assuntos aqui abordados e a mesma esteja em inglês, por favor, nos encaminhem este material que estaremos avaliando e, se for o caso, efetuando a sua tradução.

Bom trabalho a todos!

quarta-feira, 25 de abril de 2007

Magic Blog Brasil

Para qualquer técnico que já ouviu falar sobre o software Magic, sabe que este é uma ferramenta RAD. Desenvolver com Magic é muito fácil, um aprendiz de programador, tira em minutos um programa de cadastro, que pode ser usado para modificar e excluir registros.

Mas o Magic não serve apenas para este simples exemplo, é possível desenvolver grandes softwares, como benchmark temos o ERP CIGAM. Na sua origem embrionária usou-se o Joiner, mas devido a necessidades de evolução optou-se por usar o Magic.

Neste Blog, tentaremos discutir um pouco mais o que é possível realizar com esta grande ferramenta de desenvolvimento.

Enjoy :)