-
Posts
1,229 -
Joined
-
Last visited
-
Days Won
24
Everything posted by alex2002
-
Ajuda - Validar código de barras de boletos de arrecadação
alex2002 replied to zekasan's topic in Programação
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 -
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.
-
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
-
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
-
Maravilha José. Muito bom, vou olhar. Mais uma vez, obrigado. Alexandre Pereira
-
Já é alguma coisa pra poder estudar. Obrigado meu amigo. Um abraço, Alexandre Pereira
-
Ninguém? Será que estou querendo demais? rsrsrsrsrs
-
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
-
ah bom, legal! ótimo que resolveu
-
COMANDO EM SQL DEMORANDO DEMIAS QUANDO A BASE É GRABDE
alex2002 replied to marcioe's topic in Programação
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 -
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
-
Desabilitar ordenação do JSON com a hb_jsonencode()
alex2002 replied to alex2002's topic in Programação
Valeu Rossine, Já resolvi, mas é bom saber que existe essa possibilidade. Um abraço, Alexandre Pereira -
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
-
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
-
Desabilitar ordenação do JSON com a hb_jsonencode()
alex2002 replied to alex2002's topic in Programação
Concordo plenamente. -
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,
-
Desabilitar ordenação do JSON com a hb_jsonencode()
alex2002 replied to alex2002's topic in Programação
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, -
Desabilitar ordenação do JSON com a hb_jsonencode()
alex2002 replied to alex2002's topic in Programação
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í? -
Desabilitar ordenação do JSON com a hb_jsonencode()
alex2002 replied to alex2002's topic in Programação
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 -
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
-
Expandir Dialog de acordo com a resolução do monitor
alex2002 replied to alex2002's topic in Programação
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 -
Expandir Dialog de acordo com a resolução do monitor
alex2002 replied to alex2002's topic in Programação
Vou testar e te falo. Obrigado Jão. Alexandre Pereira -
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
-
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
-
Blza, vou olhar e qq coisa retorno. Obrigado