segunda-feira, 31 de agosto de 2009

Problemas com relatório não encontrado

Normalmente colocamos os qrps e imagens na mesma pasta do executável para que, quando o aplicativo precisar usar esses arquivos, eles sejam encontrados facilmente por estarem na mesma pasta do executável. Fazemos isso devido a um comportamento do Windows que podemos denominar de Current Directory, ou Diretório Atual. Quando executamos um aplicativo, Current Directory aponta para a pasta em que o executável está, pois o Windows, por default, configura a propriedade “iniciar em” do atalho, para apontar para a mesma pasta onde o executável está. Para ver isso clique com o botão direito em qualquer atalho no seu Windows.

É graças a esse comportamento do Windows que encontramos os qrps e imagens quando estão na mesma pasta do executável. Mesmo que dentro das aplicações nós não informamos o path, apenas o nome do arquivo.

Porém, a execução de algumas ações podem fazer com que Current Directory seja modificado em run-time sem que percebamos isso. Por exemplo, qualquer aplicação que permitir que o usuário escolha uma pasta para salvar um arquivo gerado pela aplicação. Um exemplo muito prático disso é uma aplicação que salve algum arquivo txt ou pdf e abra a caixa de diálogo para o usuário escolher onde ele deseja salvar o arquivo gerado. Após escolher a pasta e salvar o arquivo, Current Directory passa a apontar para o local escolhido pelo usuário. Devido a isso, caso a aplicação necessite de algum qrp, ela passa a não encontrar mais nenhum qrp, imagem ou outro arquivo que esteja na pasta do executável. Alguns clientes implementaram uma rotina que verifica a existência do qrp e a própria SalReport*** informa que o qrp não foi encontrado. Porém, o qrp encontra-se no diretório do executável. Todo o problema é “resolvido” saindo do sistema e entrando novamente.

Para resolver de fato, sem que seja necessário fechar e entrar novamente o sistema, recomendo que coloquemos em nossas aplicações uma linha de código que determina o valor que desejarmos para Current Directory.

Call SalFileSetCurrentDirectory( sNewDirectory )

Minha sugestão é utilizarmos essa linha de código antes de fazer qualquer chamada a SalReportView(), SalReportPrint(), SalReportTableView() ou SalReportTableCreate() . Porém, sNewDirectory precisa conter o caminho correto do local onde o executável está localizado. (pois é lá que estão os qrps). Esta informação é uma das informações presentes numa variável global do SQLWindows chamada strArgArray. Como esta variável possui mais informações do que precisamos, precisamos excluir dela apenas o caminho e então setar CurrentDirectory corretamente. Para determinarmos o valor de Current Directory para o local onde o executável que está sendo executado está, devemos fazer o seguinte:



Dessa forma este problema não acontecerá novamente.

um abraço
Lairton N de Almeida Jr.

sexta-feira, 28 de agosto de 2009

Menu ou RibbonBar ?

Um dos recursos novos do TD 5.1 e que continua firme e forte no TD 5.2 é a nova forma de mostrar os menus dos aplicativos. A Ribbon Bar é aquela forma nova introduzida aos usuários Windows através do MS Office 2007.

Como uma imagem vale mais que mil palavras, vou direto ao assunto:

Abaixo você pode ver uma estrutura de outline normal, com a definição de um menu típico de aplicativo. Um MDI com diversos pop-up menus e menu items.





Esta estrutura irá gerar um menu bem comum aos usuários de aplicativos feitos com o SQLWindows, porém, a partir da versão 5.1 esta história muda. Os menus podem ser mostrados como RibbonBar, conforme imagens abaixo:





O ideal é que seja feito no processo de migração uma análise de como você deseja que seus usuários visualizem o menu dos aplicativos, já que agora uma área maior da janela passará a ser utilizada. Você terá que buscar ícones (se já não usa) e estudar seriamente a possibilidade de retirar a barra de ferramentas da janela onde o RibbonBar ira aparecer (para manter-se no padrão de aplicações que usam este recurso). Explorar o uso de Windows Menu e modernizar o visual dos menus da sua aplicação.

As duas formas de visualização estão disponiveis. Você pode manter os menus como eles aparecem hoje, se desejar. Ou pode modernizar os menus das suas aplicações tornando-as similares ao Office2007, imagino que os usuários irão adorar a novidade.

Já ia me esquecendo um detalhe, para informar ao SQLWindows que é para mostrar os menus como Ribbon Bar, o esforço de programação necessário é o seguinte:

On SAM_AppStartup
Set bMenuBarAsRibbonBar = TRUE

É isso mesmo, você não terá que modificar nada no outline, onde seus menus são definidos. Imagino que não dará muito trabalho migrar este recurso não é mesmo !

:)

um abraço,
Lairton N de Almeida Jr.

sábado, 25 de julho de 2009

Dicas de Programação

Prosseguindo com as dicas ...

11- Construa (ou modifique) seus menus através de uma interface amigável e de fácil utilização. Em modo de Design coloque o foco no objeto top level que você deseja configurar o menu, clique com o botão direito do mouse e acione o menu chamado Menu Editor. Na versão 5.2 você terá um incentivo a mais para utilizar o Menu Editor, através dele é possível adicionar imagem (ícone ou bitmap) a um item de menu, que, a propósito, no TD5.2 poderá ser mostrado também como Ribbon Bar.

12- Procure não utilizar as funções SqlImmediate () e SqlExists () em laços (while e loop) pois estas funções utilizam um handle sql interno de forma padrão, ou seja, não otimizada. Vindo a ser responsáveis pela maioria dos problemas de performance em sistemas.

13- Antes de imprimir seu programa fonte, configure as opções de impressão no menu File/Page Settings. Certifique-se de que selecionou o radio button Selection Only, caso contrário todo o seu outline será impresso.

14- Cuidado ao utilizar a função SalPostMsg () - a sua utilização exagerada pode fazer o aplicativo "sentar", ou seja, ficar muito lento.

15- Quando estiver em modo Design e quiser configurar o Grid basta acionar o menu Tools / Preferences e selecionar a guia Presentation. Lá você poderá configurar se o Grid estará ativo ou não além de especificar sua altura e largura.

16- Para pegar o handle de um objeto que não possua handle, como background text e group box, utilize a função SalGetFirstChild (hWndForm, TYPE_BackgroundText) que retornará o handle do primeiro background encontrado na sua tela. Utilize a função SalGetNextChild para obter o próximo background e para saber que encontrou o objeto correto utilize SalGetWindowText. Lembre-se de setar bStaticAsWindow = TRUE no App_Startup da sua aplicação.

17- Sempre que você for alterar um componente COM previamente registrado lembre-se de desregistrá-lo do seu servidor. É muito simples, basta acionar o menu Project Un-register Server.

18- Utilize a função GetUserDefaultLangID( ), definida na biblioteca kernel32.dll, para identificar o idioma default do Windows em que o aplicativo está sendo executado. Assim você pode facilmente identificar o idioma e carregar o seu aplicativo devidamente "traduzido" para o idioma nativo. Consulte o capítulo 13 do livro Programando com o CTD2000 para maiores detalhes e exemplos.

19- Lembre-se que o comando de busca do SQLWindows, menu Edit/Find, baseia-se na parte do outline que está atualmente carregada na janela Detail, ou seja, na janela mostrada do lado direito do mdi principal do SQLWindows. Por exemplo: Se você procura por um determinado datafield mas a janela Detail do SQLWindows esta mostrando o conteúdo da seção Internal Funcions, o SQLWindows não encontrará o objeto.

quinta-feira, 23 de julho de 2009

Dicas de Programação

Seguirei publicando algumas dicas de programação que vim montando ao longo de algum tempo.

1- Utilize os arquivos tipo APL para guardar suas bibliotecas de uso genérico. Você pode ter quantos arquivos tipo APL quiser. A sua utilização só vem a melhorar a organização das suas bibliotecas. Na seção Libraries utilize a declaração File Include para utilizar suas bibliotecas. Usando APLs sua equipe terá mais facilidade em trabalhar ao mesmo tempo realizando manutenção em diversos módulos da mesma aplicação simultaneamente sem que uma pessoa atrapalhe o trabalho de outra. Essa dica acaba puxando a segunda dica.

2- Faça uso dos arquivos do tipo APL. Você pode ter vários arquivos num único projeto. Suas classes, funções de uso genérico, definições de constantes, definições de ícones etc podem estar localizados em arquivos tipo APL diferentes.

prosseguindo...

3- Utilize o Team Object Manager para gerenciar seus projetos, equipes e controle de versão dos seus aplicativos. O TOM acompanha o Team Developer e é uma ótima ferramenta para gerenciamento de projetos. Com um ótimo controle sobre versões dos seus aplicativos, equipe, builds e arquivos de um modo geral. Você pode usar o TOM para gerenciar qualuqer tipo de projeto, não apenas projetos em SQLWindows, mas também projetos em qualquer liguagem, qualquer tipo de arquivo etc.

4- Muita atenção ao utilizar Timers - SalTimerSet () e SalTimerKill () . Geralmente é delicado depurar um programa que utiliza Timers. Preste muita atenção!

5- Procure não utilizar SqlPrepareAndExecute () no interior de laços - while e loop - pois o seu tempo de execução é maior do que simplesmente SqlPrepare (). Na medida do possível coloque dentro do laço a função SqlExecute () e antes de entrar no laço um SqlPrepare ().

6- Procure seguir a padronização dos nomes de objetos e variáveis sugeridas pela Centura. Dessa forma seus desenvolvedores não terão dificuldades em ler a documentação online fornecida pela Centura. Você ganha produtividade com isso.

7- Ao nomear seus objetos e variáveis, procure não utilizar letras acentuadas. Isso pode confundir o compilador do SQLWindows. Evite problemas.

8- Para que uma determinada função não seja visível na instância, ou seja, funções privadas de uma determinada classe, coloque dois "underscore" antes do nome da função. Assim : Ao invés de usuar "fFazAlgumaCoisa ()" utilize "__fFazAlgumaCoisa ()".

9- Você pode tirar ou colocar as barras de rolagens horizontal e vertical do formulário que você está desenhando acionando o menu Layout / Show Design Scroll Bars.

10- Evite utilizar muitos frames numa mesma janela. O Windows demora muito tempo para desenhar um frame. Substitua os frames pelo objeto picture. Você pode fazer tudo o que um frame faz e ainda tem a vantagem de poder manipular uma picture.

terça-feira, 7 de julho de 2009

Como começar?

Como fazer um bom início de publicações num blog de tecnologia que buscará focar suas postagens em problemas, soluções e dicas envolvendo a ferramenta Team Developer?

Talvez, eu pudesse começar escrevendo sobre o nome do produto e toda confusão que hoje existe devido ao próprio nome não ser bem definido na visão dos seus usuários. O que parece inadmissível em termos de marketing acontece com o Team Developer, pois, seus próprios usuários são os primeiros a ter dúvidas sobre como é hoje o nome da ferramenta. Gupta SQLWindows? SQLWindows 32? Centura? Centura SQLWindows? Team Developer? TD? Unify ?

Poderia utilizar como primeiro artigo algo que falasse sobre a situação do produto hoje, sobre como está o suporte a ActiveX. Não sei se seria bom iniciar falando sobre seu suporte a WebServices ou talvez fosse melhor iniciar falando sobre como pode ser usado o XML em nossas aplicações. Talvez já iniciar falando sobre os novos controles visuais do produto, o date picker, grid window, e sobre o fantástico controle RichText! Ou talvez seria melhor já iniciar explicando como funciona o novo controle TabChild e suas características que diferem do QuickTab. Meu assunto preferido no aspecto GUI seria escrever sobre Themes, porém, nossos usuários adoraram poder eles mesmo arrastarem suas barras de ferramentas para onde bem desejam. Mas não acho que seria bom o suficiente para uma abertura de postagem num blog.

Ao meu ver Ribbon Bar seria muito mais útil pois é um recurso que praticamente já está pronto em todas as aplicações em produção hoje, (inclusive a sua!) bastando adicionar uma única linha de código para que toda a sua aplicação já tenha o visual de barras de menu presentes nas ferramentas do MS Office 2007. Este sim seria um ótimo assunto pra iniciar devido a seu impacto positivo na modernização das aplicações dos usuários. Mas iniciar o blog com um artigo que no total teria uma linha de código ... não, não me parece boa idéia.

Talvez a publicação inicial pudesse tomar outro sentido, poderia tentar explicar o porque de versão atual estar no SP6 (que já foi chamado de PTF) mas aí vou ter que falar que uma das versões mais estáveis, veloz e mais usadas no Brasil seja a versão 1.5 também avançou em termos de PTF até o PTF 6. Isso seria talvez uma feliz coinciência!

Bem, são tantos assuntos que dariam um ótimo primeiro post que fiquei na dúvida e acabei não escrevendo sobre nenhum deles e sobre todos ao mesmo tempo. Uma coisa é certa, foi possível perceber que há muito pano pra manga e muita coisa pra ser falada, muita coisa para ser mostrada e muito a ser desmitificado.

É justamente isso que pretendo fazer neste espaço, conversar sobre essa tecnologia e mostrar como utilizar o Team Developer e seus recursos avançados sempre tentando focar nos principais recursos da ferramenta e nos questionamentos feitos pelos clientes e visitantes.


Um abraço,
Lairton N. de Almeida Jr.