Jump to content
Fivewin Brasil

alex2002

Membros
  • Posts

    1,229
  • Joined

  • Last visited

  • Days Won

    24

Everything posted by alex2002

  1. Olá amigo, Vou postar aqui a função que uso no caixa dos bancos que são meus clientes: ////////////////////////////DADOS DA FUNCAO////////////////////////////////// // NOME : DigitaConta /// // FINALIDADE : Digitação Manual da Linha Digitável das Contas /// // PARAMETROS : cDados (passar por referencia) /// // RETORNO : lOk /// ///////////////////////////////////////////////////////////////////////////// function DigitaConta( cDadosDoc ) local aBlocos, aoGetBloc local lSair := .f., lOk := .t. local oIco, oDlg, oBtn01, oBtn10 local nVezes := 1 aBlocos := { space(13), space(13), space(13), space(13) } aoGetBloc := array( len( aBlocos ) ) set confirm off DEFINE DIALOG oDlg RESOURCE 'DIGITACONTA' oDlg:lHelpIcon := .f. redefine get aoGetBloc[1] VAR aBlocos[1] ID 101 of oDlg picture '@K 99999999999-9' redefine get aoGetBloc[2] VAR aBlocos[2] ID 102 of oDlg picture '@K 99999999999-9' redefine get aoGetBloc[3] VAR aBlocos[3] ID 103 of oDlg picture '@K 99999999999-9' redefine get aoGetBloc[4] VAR aBlocos[4] ID 104 of oDlg picture '@K 99999999999-9' redefine buttonBMP obtn01 bitmap "ok16" ID 501 of oDlg TEXTRIGHT ACTION if( ProcessaConta( aBlocos, @cDadosDoc ), (lSair := .t., lOk := .t., oDlg:End() ), xSetFocus(aoGetBloc[1]) ) redefine buttonBMP obtn10 bitmap "sai16" ID 510 of oDlg TEXTRIGHT ACTION ( lSair := .t., lOk := .f., oDlg:End() ) CANCEL ACTIVATE DIALOG oDlg CENTERED valid lSair return lOk //////////////////////////////////////////////////// static function ProcessaConta( aBlocos, cDadosDoc ) local cDigErro := '' local lOk := .t. local x cDadosDoc := substr( aBlocos[1],1, 11 ) cDadosDoc += substr( aBlocos[2],1, 11 ) cDadosDoc += substr( aBlocos[3],1, 11 ) cDadosDoc += substr( aBlocos[4],1, 11 ) for x=1 to 4 if substr( aBlocos[x], 13,1 ) <> Modulo10( substr( aBlocos[x],1, 11 ) ) .and. substr( aBlocos[x], 13,1 ) <> Modulo11( substr( aBlocos[x],1, 11 ) ) .and. substr( aBlocos[x], 13,1 ) <> Modulo11Old( substr( aBlocos[x],1, 11 ) ) cDigErro += str(x,1)+' ' endif next if !empty( cDigErro ) MsgStop( 'Dígito(s) do(s) bloco(s) '+cDigErro+' não confere(m)', 'Verique.' ) cDadosDoc := 'ERRO' lOk := .f. endif return lOk ////////////////////////////DADOS DA FUNCAO////////////////////////////////// // NOME : modulo10 /// // FINALIDADE : calcular o digito verificador no modulo resto 10 /// // PARAMETROS : <1> numero a ser calculado /// // RETORNO : digito verificador em string /// ///////////////////////////////////////////////////////////////////////////// function Modulo10(xNumero, cSeq) local cNumero, cDV local nLen, nTotal:=0, x, nResto, nResultado DEFAULT cSeq:='121212121212' cNumero:=iif( valtype(xNumero)='N',alltrim( str(xNumero,12) ),xNumero ) nLen:=len(cNumero) cSeq:=right(cSeq,nLen) for x=1 to nLen nResultado:=val( substr(cNumero,x,1) )*val( substr(cSeq,x,1) ) nTotal+=( val( substr( str(nResultado,2),1,1 ) )+val( substr( str(nResultado,2),2,1 ) ) ) next nResto:=nTotal%10 cDV:=substr( str(10-nResto,2),2,1 ) return cDV //////////////////////////DADOS DA FUNCAO//////////////////////////////////// // NOME : modulo11Old /// // FINALIDADE : calcular o digito verificador no modulo 11 /// // PARAMETROS : <1> numero/string contendo os algarismos para calculo /// // [2] aSequencia de conferência (vetor com 12 elementos) /// // RETORNO : string contendo o digito verificador /// ///////////////////////////////////////////////////////////////////////////// function Modulo11Old( xNumero, aSeq ) local cNumero, nLen:=51, nTotal:=0, x, cDV DEFAULT aSeq:={ 4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2,9,8,7,6,5,4,3,2 } cNumero:=iif( valtype(xNumero)='N', padl( alltrim( str(xNumero,nLen) ), nLen ), padl( xNumero, nLen ) ) for x=1 to nLen nTotal+=val( substr(cNumero,x,1) )*aSeq[x] next cDV := if(nTotal % 11 < 2, "0", str(11-(nTotal%11), 1 )) return cDV
  2. Amigo, então é complicado porque o delimitador é o ":", creio que nenhum separador vai conseguir fazer este trabalho. Mas neste caso, vc pode alterar a função e separar apenas o que estiver dentro das aspas dupla.
  3. Olá Troque a HB_Atokens por aToken() atoken(oFile:ReadLine(), ';' ) Veja se resolve. Um abraço ////////////////////////////////////// Function atoken(cStr, cStr1, lVazio ) ////////////////////////////////////// LOCAL nNum, nNum1, aArr := {} LOCAL aArr1 := {} LOCAL nNum2, nNum3 Default lVazio := .f. if cstr1 = NIL cStr1 := " " endif nNum2 := len(cStr1) for nNum1 := 1 to nNum2 aadd(aArr1, substr(cStr1, nNum1, 1)) next do while .T. nNum := 0 for nNum3 := 1 to nNum2 nNum1 := AT(aArr1[nNum3], cStr) nNum := MIN(IF(nNum == 0, LEN(cStr) + 1, nNum), IF(nNum1 == 0, ; nNum, nNum1)) next if nNum = 0 exit endif if nNum > 1 aadd( aArr, left( cStr, nNum - 1)) elseif nNum = 1 .and. lVazio aadd( aArr, '' ) endif cStr := substr(cStr, nNum + 1) enddo if len(cStr) > 0 aadd( aArr, cStr) endif return aArr
  4. Olá pessoal, Queria saber se é possível mudar o alias em runtime. Possuo um executor de instruções SQL que retorna o resultado e eu jogo isso pra um alias. Acontece que pode mudar o tempo todo o resultado com colunas diferentes, daí eu queria apresentar isso. Atualmente no LISTBOX funciona de boa, mas no xBrowse ainda não consegui por pra rodar. Alguém tem uma solução? Um abraço, Alexandre Pereira
  5. Maravilha José. Muito bom, vou olhar. Mais uma vez, obrigado. Alexandre Pereira
  6. Já é alguma coisa pra poder estudar. Obrigado meu amigo. Um abraço, Alexandre Pereira
  7. Ninguém? Será que estou querendo demais? rsrsrsrsrs
  8. Olá pessoal, Alguém usa o Fast sem a edição na mão do relatório? Tenho uma pancada de relatório em RPV que são gerados dinamicamente e estou querendo passar tudo pra Fast. Mas quero mudar apenas o meu gerador de relatório para não atrapalhar os mais de 1.000 prgs que possuo hoje. Se alguém usa, por favor, passa a senha rsrsrsrsrs Um abraço, Alexandre Pereira
  9. ah bom, legal! ótimo que resolveu
  10. Olá Márcio, Vc teria que ter um índice bem apropriado na tabela vendas. Isso irá ajudar muito em termos de velocidade. Um abraço, Alexandre Pereira
  11. Olá amigo, Se entendi direito, vc terá que criar dois campos MÊS, no mesmo registro. Ex: Conta C 30 Data1 D 8 Valor1 N 15,2 Data2 D 8 Valor2 N 15,2 Se é o que entendi Um abraço, Alexandre Pereira
  12. Valeu Rossine, Já resolvi, mas é bom saber que existe essa possibilidade. Um abraço, Alexandre Pereira
  13. Então Jão, eu ia salvar neste método, usando a função hb_strtoutf8(), mas não vi parametros nela para extrair o BOM. De qualquer forma vou salvar pra ver se fica igual quando salva no Notepad++. Valeu
  14. Olá Galera, Montei o arquivo .JSON na unha pra atender o cliente. Acontece que o server do lado de lá tem que receber o arquivo no formato UTF8 mas sem o BOM (Byte order mark). Alguém gera neste formato? Um abraço, Alexandre Pereira
  15. Com a SqlLIB vc não irá conseguir. Mas conforme falou o nosso amigo Emotta, vc acessa tranquilamente pelo ODBC. Eu fiz uma mega migração usando ODBC e levando para o MySQL. Um abraço,
  16. Pois é "Karinh", eu peguei esse vírus, passei muito mal, muito mesmo. Mas hoje, graças a Deus, estou bem. Vamos marcar sim. Um abraço,
  17. Obrigado a todos, na verdade o problema não era o Json e sim o HASH() que de fato é ordenado. A função hb_jsonencode() não muda a ordenação. De fato para o server que vai receber o arquivo json tanto faz a ordem, mas como eu estava atrasado (ainda estou rsrsrsrs) fiz a geração na unha mesmo. Obrigado aos amigos. Jão, tudo tranquilo por aqui, e como estão as coisas por aí?
  18. Na verdade eu percebi que o problema não é na hb_jsonencode e sim no hash() que ordena as tags, agora sinceramente não sei o que fazer
  19. OIá pessoal, alguém sabe me informar qual parametro uso para que na codificação do Json (hb_jsonencode()) não ordene as tags e sim deixe na ordem da criação das mesmas? Ex: ///////////////////////////////////////////////////////////////////////// hJson := hash() hJson['campo3'] := 'teste 3' hJson['campo1'] := 'teste 1' hJson['campo2'] := 'teste 2' cJson := hb_jsonencode( hJson, .t. ) ? cJson resultado: { "campo1" : "teste 1", "campo2" : "teste 2", "campo3" : "teste 3" } Sendo que eu queria que ocorresse assim: { "campo3" : "teste 3", "campo1" : "teste 1", "campo2" : "teste 2" } Ou seja, na sequência que eu inseri tem mais algum parametro na função hb_jsonencode() ? Não achei a documentação da mesma nem a pau
  20. Obrigado amigo, Mas a solução não seria apenas redimensionar a dialog mas sim todo o conteúdo dentro. Exatamente a solução que o João postou (não testei ainda nos meus fontes, mas vi que é exatamente isso pelo que observei do exemplo). O que tem acontecido é que hoje as resoluções são cada vez melhores e os monitores maiores, isso faz com que o GET, SAY, BUTTON... por exemplo fiquem nanico nestas telas e chega a ficar feio. Para podermos aumentar tudo fica complicado, teríamos que mexer em tamanho das fontes além de redimensionar tudo. A solução que o João postou faz exatamente isso, ela redimensiona fazendo um relacionamento entre o que foi desenhado e a resolução atual. Assim que testar eu posto o parecer aqui. Um abraço, Alexandre Pereira
  21. Vou testar e te falo. Obrigado Jão. Alexandre Pereira
  22. Olá pessoal, Tenho notado que nos micros mais novos, as dialogs estão ficando muito pequenas. Sei que no fórum aqui houve uma solução pra isso. Alguém lembra ou usa a solução? Quero aumentar o tamanho da dialog de acordo com a resolução do windows, assim consigo fazer ficar bacana o sistema. Mas não me lembro nem a pau onde está essa solução. Um abraço, Alexandre Pereira
  23. Olá. Sugiro criar uma tabela (ou arquivo DBF), e colocar cada boleto como registro. Daí vc dimensiona a página com um registro (pelo masterdata) e daí cada página será um boleto. Um abraço, Alexandre Pereira
  24. Blza, vou olhar e qq coisa retorno. Obrigado
×
×
  • Create New...