Pular para o conteúdo principal

Postagens

Mostrando postagens de outubro, 2011

Postagem em destaque

BlackTDN :: Social :: Rifa Festival da Arte Capoeira Projeto Eu Sou Ninja

Angariar fundos para cobrir os custos logísticos do "Festival da Arte Capoeira" e apoiar o projeto Eu Sou Ninja em sua missão de promover a integração social e cultural na comunidade de Jacaraípe. Com a criação da rifa, buscamos envolver a comunidade de forma ativa no financiamento do evento, permitindo que todos contribuam para o sucesso do festival e para a continuidade das atividades do projeto. Prêmio: Copia da minha biblioteca pessoal de AdvPL/TLpp ..etc Participe da Rifa Eu já contribui. Só falta você! ```cmd Pasta de C:\GitHub\naldodj-tlpp 13/04/2024 19:17 . 19/03/2024 13:49 .. 05/01/2024 12:22 2.742 .gitattributes 14/11/2023 16:02 83 .gitignore 02/12/2023 20:08 .vscode 05/01/2024 12:05 bin 13/04/2024 19:18 4.121 ChangeLog.txt 27/12/2023 02:05 include 14/11/2023 16:02 27.030 LICENSE.txt 14/11/2023 16:02 0 makepatch.lst 14/11/2

Protheus :: MSSQL :: Abstraindo com Full Outer Join

Dia deses precisei criar uma relação de [1:1] para efetuar um cálculo específico de rateio para contabilização do “Time Sheet” onde o valor de uma consulta subtrairia o  valor da consulta relacionada. Na correria não consegui solucionar o problema no cliente (estava na “hora do rush” e todos queriam ir embora) então levei a lição pra casa. O Problema com o qual havia me deparado era o seguinte: A Relação feita poderia resultar em: [ n : n ] , [ n  : ( n – 1 ) ] ou [ ( n – 1 ) :  n  ]. Quando [ n : n ] não teriamos problema, pois o conjunto de elementos n, na relação, seriam sempre equivalentes [ 1:1 ]. No segundo caso, em que a relação seria: [ n  : ( n – 1 ) ] também não teríamos problema, se a relação fosse da esquerda para a direita  uma vez que todo elemento do conjunto ( n – 1 ) estaria contido em n; o contrário não seria verdadeiro. O mesmo poderíamos dizer quando a relação fosse: [ ( n – 1 ) :  n  ] com relacionamento da direita para a esquerda. O problema: como definir a

Protheus :: Advpl :: Pensamentos :: Alcançando a Proficiência

pro.fi.ci. ên .ci:a Ajuda qualidade de quem é proficiente ; habilidade , competência vantagem , proveito As vezes me pergunto: “Será que fui eu mesmo quem escreveu esse código?”. “Como cheguei à essa conclusão?”. “ Porque usei esse algoritmo em detrimento do outro?” Quando estou sendo eficiente, proficiente ou apenas “psicografando”? O saber inibe? Devo ter vergonha em afirmar o que sei? Acredito que não. Se sou conhecedor, devo me fazer conhecido. O Conhecimento abre portas, expande o horizonte e te torna um “Proficiente”. Percebi que aqui no “Estado do Rio de Janeiro”, e depois do papo com o Regazzo; não só aqui, as pessoas tem problemas com o “ Superego ”. Sempre que me “afirmo” como um profundo conhecedor da linguagem ADVPL, quando me afirmo como “o cara” sou repreendido. Ai fico pensando, será que o problema sou eu? Será que sou tão arrogante assim, ou como diriam os cariocas, tão “marrento assim”?. Na realidade NÃO. Não é questão de ser arrogante e muito menos “marre

Protheus :: Advpl :: Criando Pontos de Restauração

Uma coisa interessante nos SO´s é a possibilidade de criar “Pontos de Restauração” onde podemos restaurar o sistema a um “Estado” anterior. o Protheus deveria ter algo assim. Existem várias rotinas que exigem um “Ponto de Restauração” dentre elas: “Fechamento Mensal da Folha”, “Transferência de Funcionários”, “Configuração de TES”, “Parâmetros do Sistema”, “Atualização do Sistema”, … , dentre outras. Normalmente, usamos o “Restaurar Back UP” quando acontece algum problema durante esses processos. Mas, além dos processos citados, existem “Momentos” em que “Um Ponto de Restauração” seria uma excelente solução. As vezes precisamos saber e restaurar o estado do sistema em “Determinando Instante” e, o simples “Back Up” nem sempre é a melhor solução. Vou implementar um processo de “Ponto de Restauração” baseado em uma Rotina Específica. Ela irá salvar o Conteúdo de alguns campos e de algumas tabelas que, a qualquer momento, poderão ser “Restaurados” ao seu valor original permitindo a consul

Protheus :: MSSQL :: Retornando o conteúdo de campo “Memo” em uma Consulta

Às vezes precisamos consultar o conteúdo armazenado em um campo memo e, um simples SELECT não irá nos ajudar pois o conteúdo retornado será “ Ininteligível ”. SELECT    [alias].[memoField] AS [MEMO] FROM    [table] [alias] WITH (NOLOCK) irá retornar algo como: SELECT     [SRM].[R_E_C_N_O_],     [SRM].[RM_MEMO] AS [MEMO] FROM     [SRM010] [SRM] WITH (NOLOCK) Para que a consulta retorne o conteúdo que desejamos e não o seu valor binário, necessitaremos efetuar conversões de tipo usando a função “CONVERT” conforme abaixo: SELECT     [SRM].[R_E_C_N_O_],     ISNULL(CONVERT(VARCHAR(1024),CONVERT(VARBINARY(1024),[alias].[memoField])),'') AS [MEMO] FROM     [table] [alias] WITH (NOLOCK) Onde teremos: SELECT    [SRM].[R_E_C_N_O_],    ISNULL(CONVERT(VARCHAR(1024),CONVERT(VARBINARY(1024),[SRM].[RM_MEMO])),'') AS [MEMO] FROM    [SRM010] [SRM] WITH (NOLOCK) ou, de forma semelhante, com “CAST” onde teríamos: SELECT    ISNULL(CAST(CAST([alias].[memoFiel

Protheus :: Advpl :: GetResArray :: Obtendo a Lista dos Resources Armazenados no RPO

Use a Função GetResArray( cResName ) para obter a Lista de todos os “Resouces” armazenados no RPO. O parâmetro cResName aceita o caractere “*” Asterisco (do latim asteriscum, do grego ἀστερίσκος e, genéricamente, "estrelinha")  como “Curinga” Ex.: GetResArray(“12.bmp”) Irá retornar o “resource” de nome 12.bmp Usando o caractere “*” como sufixo, teremos: GetResArray(“12*”) Todos os nomes dos “resources” prefixados com “12” Já, ao usar o caractere “*'” como Prefixo e Sufixo na pesquisa, teremos GetResArray(“*12*”) A lista de todos os “resources” que contenham “12” em seu nome []s иαldσ dj

Protheus :: Advpl :: tSocketClient e Harbour Inet Server

No post anterior, Protheus :: Advpl :: tSocketClient , demonstrei a pedido do nosso amigo Daniel, como usar a Classe tSocketClient para efetuar conexões a um serviço HTTP. Agora um exemplo mais real e de acordo com o questionamento original; provavelmente ninguém irá conectar-se a um serviço HTTP via Socket uma vez que temos os protocolos correspondentes no Protheus: Usariamos HttpGet() e HttpPost() para esse fim. Em função disto, peguei emprestado um código do Harbour Projet (por Giancarlo Niccolai c:\hb31\tests\server.prg $Id: server.prg 16704 2011-05-01 20:22:54Z vszakats $), fiz algumas modificações, renomeei para c:\u_tSocketClient\hb_socketSrv.prg e criei o hb_socketSrv.exe. Neste novo exemplo executaremos trocas de mensagens entre o Protheus, através da Classe tSocketClient, e o Harbour Inet server (que denonimei de hb_socketSrv). Nossa aplicação irá, primeiro, “acordar” o Harbour Inet Server e depois começarão as trocas de mensagens até que um “quit” seja enviado. Como no ex

Protheus :: Advpl :: code google :: totvs-advpl-naldodj

Criei o Projeto “totvs-advpl-naldodj” no code google de forma a compartilhar algumas dezenas de linha de código de utilidades e inutilidades com vocês. Isso irá facilitar  o gerenciamento e manutenção.  Antes, preciso “compilar” todos os códigos que já publiquei e outros que tenho “espalhado” em meu note e pc de forma a compartilhar o que de fato é interessante, ou não. []s иαldσ dj

Protheus :: Advpl :: Obtendo parâmetros (SX6) de outra empresa

Dia desses, modificando uma “customização” em um cliente, deparei-me com um código que obtinha/gravava o conteúdo dos parâmetros SX6 de outra empresa. Isso se fazia necessário uma vez que, pelo modelo implantado, existia uma empresa consolidadora. Considerando que não gostei da forma que o código havia sido implementado, criei a minha própria versão que agora compartilho com vocês. Ei-la… Para obter o(s) parâmetros: Chame-a como: cMvPar := ”MV_PAPONTA” cMvDef := “” StaticCall(U_GETMV,_GetMvPar,”02”,”01”,cMvPar,cMvDef) –> uMvCnt ou, para mais de um parâmetro a ser obtido: aMvPar   := { “MV_PAPONTA”,”MV_PONMES”} aMvDef   := { “” , “” } StaticCall(U_GETMV,_GetMvPar,”02”,”02”,aMvPar,aMvDef) –> aMvCnt e, Para gravar o(s) Parâmetros:   Execute-a como: cMvPar := “MV_PAPONTA” cMvPut := “20110101-20110131” StaticCall(U_GETMV,_PutMvPar,”01”,”01”,cMvPar,cMvPut) ou, para mais de um parâmetro a ser gravado: aMvPar := { “MV_PONMES” , “MV_PAPONTA” } aMvPut  := {

Protheus :: Advpl :: tSocketClient

Classe: tSocketClient . Segundo o tdn : “Estabelece uma conexão client de socket do tipo TCP genérica. Através desta classe, é possível enviar e receber dados por meio de um socket genérico e utilizar como base para implementação de protocolo não suportado pela aplicação.” O tdn, como sempre, incompleto e com exemplo “rústico”. Então um exemplo mais sofisticado seria: Criar o Objeto do tipo tSocketClient Tentar conectar-se ao live.sysinternals.com Verifico se a conexão foi bem sucedida, e elaboro a mensagem para envio Envio e mensagem e Obtenho o Retorno. No Exemplo conectaremos, via SocketClient, usando HTTP GET. Obtendo os seguintes resultados: Para obter o código usado no exemplo, clique aqui . As dependências para o funcionamento do exemplo poderão ser obtidas em: Protheus :: Advpl :: Usando GetFuncArray, GetApoInfo e VarInfo : para tVarInfo. []s иαldσ dj

Protheus :: Advpl :: Google maps :: Localizando o endereço mais próximo

Tempos atrás alguém me pediu uma ajuda para resolver um problema da Kasinski: Enviar, a seus clientes, carta informando sobre o “Recall” de suas motos contendo, no máximo, o endereço de três concessionárias próximas à sua localidade (CEP). Bastou entender a regra de formação do CEP e o problema foi facilmente resolvido. Ia usar a carta como exemplo, mas, como perdi o contato com a pessoa, reescrevi o código, agora usando o Google maps. A idéia básica é a seguinte: Informe o CEP de sua localidade e encontre o(s) endereço(s) mais próximo(s). Para o “Recall” da Kasinski havia usado o Código de Endereçamento Postal das Concessionárias. No exemplo que segue, e, considerando que se trata de ADVPL, vou usar alguns endereços da TOTVS (obtidos a partir do link canais ). Vamos imaginar o seguinte. Estou na Rua São João, no Centro de Niterói (CEP 24020-040) , e quero achar a TOTVS mais próxima. Informo o meu CEP e… Se encontrei correspondente(s)… Apresento(-os). O mais próximo na Cidad

Protheus :: Advpl :: Dicas do Robson :: Usando UniqueKey() para filtrar registros

Função: UniqueKey( <uFields> , <cAlias>, <lResetKeys>, <nMaxRec> ) Objetivo: Verificar se a chave passada é única de acordo com o campo ou campos passados nos parâmetros. Esta função ajuda a apresentar um único registro quando houver vários semelhantes, por exemplo: Fazer consulta SXB na tabela SC7, porém apresentando um registro por pedido de compra independente de quantos itens existam. Parâmetros: uFields – String contendo o campo ou Array  unidimensional com as strings dos campos que que serão considerados para pesquisa da chave única. cAlias – Alias do arquivo para pesquisa. lResetKeys – Reinicializa as chaves. nMaxRec – Número máximo de elementos. Essa mesma dica poderá, por extensão, servir ao fitro do MPSDU/APSDU como abaixo: !Deleted().and.C7_EMISSAO>=FirstDate(Date()).and.C7_EMISSAO<=LastDate(Date()).and. UniqueKey({"C7_FILIAL","C7_NUM"}) Irá retornar todos os primeiros n registros da tabela SC7, não delet

Protheus :: Advpl :: Dicas do Robson :: Como criar uma consulta específica utilizando os recursos do dicionário SXB

Robson Luiz nos passou mais uma dica: “Como criar uma consulta específica utilizando os recursos do dicionário SXB – Consulta padrão. O exemplo descrito abaixo é apenas para se ter uma idéia de como unir os mecanismos disponíveis. Neste exemplo será demonstrado como gravar o endereço lógico de um arquivo tipo MS-Word ou Adobe em um campo da tabela em questão. Crie um campo na tabela SA6 – Cadastro de Bancos;  A6_CONTRAT – tipo caractere, tamanho 50;  Crie uma consulta SXB da seguinte forma: Clique no botão Avançar e preencha a próxima tela da seguinte forma: Repare que no campo retorno há a menção somente da função U_SA6_01().  Clique no botão Finalizar para salvar os dados e vamos programar. Abra o DevStudio (IDE) Abra um novo arquivo e digite o seguinte programa: Salve este arquivo. Anexe a um gerente de projetos do DevStudio. Compile este programa. Coloque o ALIAS da consulta SXB no campo X3_F3 do campo SA6_CONTRAT. É possível construir diversas soluções utilizando