Mello Junior

Members
  • Content count

    64
  • Joined

  • Last visited

  • Days Won

    10

Posts posted by Mello Junior


  1. Amigo,

    Utilize o que normalmente o Banco oferece, a função de agregação serve sim, mas o script não pode ser apenas para saber qual o maior número único. Em postgres temos um tipo especial de objeto denominado sequencia a qual pode ser manipulada simplesmente dizendo para o "DEFAULT" da coluna da tabela que pegue o próximo valor da sequência. Agora caso não seja PostgreSQL, atente para alguns detalhes. 

    1. Isolar a tabela

    2. Pegar o maior valor (normalmente em Postgres você faz isso com apenas uma sentença SELECT adicionando uma cláusula FOR UPDATE;

    3. Inserir na tabela o Registro pretendido já utilizando o max + 1 obtido na sentença anterior

    4. Liberar o isolamento (Commit da vida)

    Att

     

    1 person likes this

  2. Bom Dia,

    Temos algumas situações. O mecanismo de relacionamento utilizado nos SGBD normalmente contemplam a obrigatoriedade de que TODOS os filhos tenham pais. Isso para manter a consistência das regras. Em sua grande parte funciona que é uma beleza, mas tem algumas situações em que precisamos utilizar de nossa criatividade. A primeira ideia para manter a consistência temos de definir, em caso de alteração da chave o que o SGBD deve providenciar, regravar em todos ou ainda remover os filhos e finalmente em caso de exclusão do pai o que fazer com os filhos. Essa regra denominamos de "INTEGRIDADE RELACIONAL" e muitos confundem com relacionamento de relatório. 

    Vamos a para alguns casos práticos. Pedido, Itens e parcelas. Identificando o Pai, PEDIDO, tem seus filhos ITENS e PARCELAS. Se eu remover o pedido, espero que não fique qualquer "lixo" ou seja de nada me adianta eu ter itens de pedidos inexistentes e o mesmo procedimento para com as parcelas. Agora o seu caso prático, documentos de clientes para órgãos emissores. Se remover um órgão emissor, claro que não quero que seus filhos sejam excluídos, então com toda a segurança devo informar ao SGBD que é a regra é RESTRITA, ou seja, se tentar remover e o cara tiver um único filho que o utilize, impeça tal exclusão. E como fazer para aqueles documentos que não tem um orgão emissor ou mesmo que não tenha sido informados? Simples, cria-se um registro pai com a denominação "SEM ÓRGÃO INFORMADO" e antes de colocar as regras, deve-se fazer um select para que todos os registros que tenham NULL no relacionamento documento <-> órgão emissor seja colocado tal informação. Na aplicação essa opção também pode aparecer no "DROP DOWN" e assim atende-se a todas as regras.

    Por fim, um comentário acerca da ANÁLISE. Ela serve como dicionário de dados, mas não serve como garantia de INTEGRIDADE RELACIONAL, mesmo para o HFSQL se você quiser aplicar tal regra tem de executar um comando a parte para depois manipular o registro em si. O que na ANÁLISE eu faço é muitas vezes apontar um relacionamento falso, para que a linguagem me facilite o trabalho de alguns componentes em tempo de projeto (podendo até mesmo permanecer para o tempo de execução) pois como falei, se não for explicitamente chamada a verificação de integridade o WD nada fará com essas regras.

     

    Abraços

     

    1 person likes this

  3. Na solução que utilizo não me importo com qual terminal e sim com o total de acessos simultâneos, logo a cada login faço as anotações e por um simples count(*) eu tenho o total de logins. A desvantagem é que tive de colocar um recurso parra baixar os logins quando o usuário não fecha a aplicação e simplesmente desliga o windows.

    Em tempo, a quantidade de terminais fica anotado dentro de um registro de ADM dentro do próprio BD, a diferença é que tem um hash de todas as colunas e se o cliente for direto e alterá-la a aplicação inteira para porque o hash passa a não conferir.

    []´s

     

    2 people like this

  4. Depois de apanhar igual a "mulher de bandido" e mais alguns dias de estudo, cheguei ao consenso sobre a certificação digital sobre o arquivo PDF. Na realidade tanto faz se for utilizar A1 ou A3, o ponto está em permitir que o usuário escolha com qual certificado ele irá utilizar. Então vejamos:

    • MyCertificate is Certificate    = CertificateSelect()
    • IF MyCertificate..Name = "" THEN
    •     RETURN
    • END
    • MySignature is pdfSignature
    • MySignature..Certificate = MyCertificate

    Não há necessidade de informar nem o arquivo PFX e muito menos a senha, pois ao tentar selecionar o próprio Windows se encarrega dessa parte. se Name retornar vazio, é porque o usuário escolheu cancelar ao invés de ter selecionado algum certificado.

    Fiz muitos testes e todos vieram a contento e a imagem ficou muito legal dentro do PDF, contudo não consegui dar uma boa opacidade.

     

    Abraços

     

    3 people like this

  5. Uma Classe deve se tornar um objeto e então poderá utilizar qualquer um dos métodos ali declarados. É muito simples fazer isso com WD, pois automaticamente uma variável argumentada passa o seu endereço (além do conteúdo) então fazer com que o objeto se comunique com o chamador é tranquilo. Quanto a ter de atualizar, eu utilizo um arquivo em determinado local, fora da árvore da pasta do projeto, então quando altero esse arquivo tenho de recompilar todas os projetos para que possam usufruir das novas alternativas. Nem fica dentro de um componente, é uma classe declarada no projeto e instanciada no início de sua execução.

    []´s

     

    1 person likes this

  6. Olá,

    Além das soluções, lembre-se de que pode criar uma tabela em SQL tranquilamente e para qualquer outro terminal ler, bastará ter acesso ao catálogo do SGBD, é bastante tranquilo, entenda que como não haveria um CRUD sobre ela, o que você está pensando é específico para VIEWS, as quais também podem ser criadas diretamente no SGBD e podem ser lidas pela catálogo.

    []´s

     


  7. Olá,

    A ideia de componentes externos, é ótima mas deve-se atentar para o fato de que ela tem de ser o bastante. Não deve ser de uso comum e o acesso aos seus componentes tem de ser através de funções para que funcionem bem.

    Por exemplo, elaborei um componente para a biometria, então todas as funções de biometria ficaram por conta de suas rotinas, a captura, a verificação, a captura de imagem biométrica, a verificação se existe um dispositivo conectado e assim por diante. Vislumbrei um efeito secundário sensacional, quando instalo esse componente em qualquer outra aplicação automaticamente é refletido para as windows do componente, ficando totalmente transparente para o usuário final de que se trata de uma rotina à parte.

    Já para o caso de funções de apoio, como essa do CPF/CNPJ, ou mesmo de máscaras de apresentação (CEP, CPF, CNPJ, Códigos diversos) o que indico é a criação de uma classe de apoio, você conseguirá uma uniformidade e terá sempre um bom patrimônio de seus hábitos. Além do que é muito simples de passar de um projeto para outro.

    []´s

    1 person likes this

  8. Eu faria algo bem mais simples, quando o EDT ganhar o Foco, você colaca no Caption do botão de consulta "CONS PRODUTOS" e quando o EDT do Cliente ganhar o foco você colocar no Caption "Cons Clientes". Então no botão de consulta você verifica se estiver escrito Clientes ou Produtos.

    A vantagem dessa técnica é que no caption você prepara o seu usuário para ir exatamente ao que estiver indicado no botão.

     

    []´s

     

    2 people like this

  9. Normalmente o PREVIEW é composto de um ou mais arquivos temporários, que deveriam ser criados dentro da pasta TEMP do usuário. Verifique se por acaso essa pasta não está muito carregada, o que poderia gerar um comportamento igual, veja também se nenhum desses arquivos não estejam com atributos de manipulação negados.

     

    Att

     


  10. Não entendi a sua ideia de "concorrência". Tenho um cliente A sendo alterado no terminal 1 e outro terminal tem a alteração do mesmo cliente. Então os dois leram o endereço antigo, o primeiro terminal vai e altera para um novo endereço e o terminal 2 não vai ter refletida as alterações do terminal 1 em sua tela. Isso é concorrência de Leitura. Diferente de uma transação que quando toda a operação estiver pronta, você abre a transação, processa tudo e libera novamente os arquivo, se alguma coisa der errado todas as informações serão preservadas da maneira como estavam anteriormente. O CLARION tinha um comando muito útil denominado REREAD e automaticamente antes de gravar ele faz um reread e comparava com as informações originais e se estivessem diferentes, abordava o processo avisando que outro usuário alterou aquele registro.

    A leitura concorrente é para IMPEDIR que haja uma alteração na tabela enquanto outro terminal já esteja alterando. Então, pode-se ter um campo string denominado usuario e escrever ali o nome do usuário que entrou para completar a tarefa. Se o outro terminal tentar ler o mesmo terminal (para alteração do cadastro) e visualizar que o campo está preenchido, o programa avisará que o registro está sendo alterado pelo usuário tal. e quando o primeiro usuário concluir a operação, o programa deve limpar a coluna usuário, deixando assim para que qualquer outro terminal possa acessar aquele registro livremente.

    []´s


  11. Olá,

     

    Se quiser trabalhar em uma coisa mais lógica, trabalhe direto na grandeza, por exemplo, se eu quiser somar 90 horas em um datatime:

    dtFinalDateTime is DateTime = SysDateTime()
    dtFinalDateTime..Hour += 24

    Se quiser trabalhar com minutos, então: 

    dtFinalDateTime is DateTime = SysDateTime()
    dtFinalDateTime..Minute += 190 //somando 190 minutos para o datatime

    de forma similar para variáveis do tipo time:

     

    tFinalDateTime is Time = Now()
    tFinalDateTime..Minute += 190
     

    Abs

     


     

     

    3 people like this