Jump to content
Fivewin Brasil

oribeiro

Membros
  • Posts

    1,291
  • Joined

  • Last visited

  • Days Won

    35

Posts posted by oribeiro

  1. Eita João,

    Você me ajudou muito!

    Só faltava colocar .T. como segundo parâmetro do hb_sha1().

    // CRIAR HashCSRT //
    wCSRT   := "G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO"
    wChave  := "41180678393592000146558900000006041028190697"
    codigo  := wCSRT + wChave
    codigo1 := hb_sha1(codigo, .T.)     
    codigo2 := HB_Base64encode(codigo1, Len(codigo1))
    Msginfo( codigo1+chr(13)+chr(13)+"Modelo: aWv6LeEM4X6u4+qBI2OYZ8grigw="+chr(13)+chr(13)+"Gerado: "+codigo2, "HB_base64encode() -> Tamanho: "+str(len(codigo2)) )

    Muito obrigado, mais uma vez.

  2. Pessoal,

    Para aumentar a segurança do sistema dentro do Terminal Server, eu criei uma rotina para abrir uma tela de explorador de arquivos onde o usuário não consegue apagar os arquivos, mas apenas selecioná-los:

    function xGetFiles( cMask, cTitle, nDefaultMask, cInitDir, lNova ) // Permite a seleção de múltiplos arquivos
       #define OFN_PATHMUSTEXIST            0x00000800
       #define OFN_NOCHANGEDIR              0x00000008
       #define OFN_ALLOWMULTISELECT         0x00000200
       #define OFN_EXPLORER                 0x00080000     // new look commdlg
       #define OFN_LONGNAMES                0x00200000     // force long names for 3.x modules
       #define OFN_ENABLESIZING             0x00800000
       Local   cSelect, cPath, cAux, cAux1, nAt, nFlags, lSave:=.F., aFiles := {}
       Default cMask        := "Todos (*.*)|*.*|"
       Default cTitle       := "Selecione o arquivo"
       Default nDefaultMask := 1
       Default cInitDir     := ""
       Default lNova        := .F.
       cInitDir:= iif(Empty(cInitDir), PastaTxt(), cInitDir)
       if lNova // Tela nova do Windows (mas permite que o usuário apague arquivos)
          nFlags := nOr( OFN_PATHMUSTEXIST, OFN_NOCHANGEDIR, OFN_ALLOWMULTISELECT, OFN_EXPLORER, OFN_LONGNAMES, OFN_HIDEREADONLY, OFN_NONETWORKBUTTON )
          MsgRun("Esperando você selecionar o arquivo...",,{|| aFiles := cGetFile(cMask, cTitle, nDefaultMask, cInitDir, lSave, .T., nFlags) })
          if Len( aFiles ) > 1
             for nAt := 2 to Len( aFiles )
                aFiles[ nAt ]  := aFiles[ 1 ] + "\" + aFiles[ nAt ]
             next
             ADel( aFiles, 1 )
             ASize( aFiles, Len( aFiles ) - 1 )
          endif
       else     // Tela Antiga que limita o usuário.
          nFlags := nOr( OFN_PATHMUSTEXIST, OFN_NOCHANGEDIR, OFN_ALLOWMULTISELECT, OFN_LONGNAMES, OFN_HIDEREADONLY, OFN_NONETWORKBUTTON )
          MsgRun("Esperando você selecionar o arquivo...",,{|| aFiles := cGetFile(cMask, cTitle, nDefaultMask, cInitDir, lSave, .T., nFlags) })
          if "\ "$aFiles[1] // Se selecionou múltiplos arquivos
             cSelect := aFiles[1]
             aFiles  := {}
             cPath   := Left(cSelect, RAT("\", cSelect))     // Caminho
             cSelect := Alltrim(Subst(cSelect, Len(cPath)+1, Len(cSelect)))
             Do While "."$cSelect
                cAux      := Left(cSelect, AT(".",cSelect))  // Nome do Arquivo
                cSelect   := Alltrim(Subst(cSelect, Len(cAux )+1, Len(cSelect)))
                if " "$cSelect
                   cAux1  := Left(cSelect, AT(" ",cSelect))  // Extenção do Arquivo
                   cSelect:= Alltrim(Subst(cSelect, Len(cAux1)+1, Len(cSelect)))
                else
                   cAux1  := cSelect
                   cSelect:= ""
                endif
                AAdd(aFiles, cPath+Alltrim(cAux)+AllTrim(cAux1))
             EndDo
          endif
       endif
    return( aFiles )

    Agora eu preciso que os arquivos que o usuário selecionou sejam colocados na área de transferência (Ctrl+C) mas não estou conseguindo, alguém pode me ajudar?

    aFiles := xGetFiles("Todos (*.*)|*.*|", "Selecione o arquivo(x)", 1, "", .F. )
    oClp:=TClipboard():New()
    oClp:Clear()
    for i=1 to len(aFiles)
       oClp:SetText( aFiles[1] )
    next
    oClp:End()

    Tentei assim, mas também os arquivos não foram para a área de transferência:

    aFiles := xGetFiles("Todos (*.*)|*.*|", "Selecione o arquivo(x)", 1, "", .F. )
    OpenClipboard( GetDesktopWindow() )
    for i=1 to len(aFiles)
       SetClipboardData( 1, aFiles[i] )
    next
    CloseClipboard()

     

  3. Estou tentando fazer isso:

    Passos necessários para geração do "hashCSRT" :

    1) Concatenar o CSRT com a chave de acesso da NF-e/NFC-e que está sendo emitida.

    CSRT: G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO

    Chave de Acesso: 41180678393592000146558900000006041028190697

    Concatenada: G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO41180678393592000146558900000006041028190697

    2) Aplicar o algoritmo SHA-1 sobre o resultado da concatenação do passo 1, resultando em um string de 20 bytes hexadecimais.

    Resultado: 696bfa2de10ce17eaee3ea8123639867c82b8a0c

    3) Converter o resultado do passo anterior para Base64, resultando em uma string de 28 caracteres;

    Resultado: aWv6LeEM4X6u4+qBI2OYZ8grigw=

    4) Montar o grupo de identificação da empresa desenvolvedora do software (tag: infRespTec), com a tag "idCSRT" o identificador do CSRT utilizado para a geração do hash e a tag "hashCSRT" o resultado do passo 3.

    Resultado:

    Responsável Técnico da NF-e e NFC-e

    Fonte: NT2018_005_v1_20

  4. Bom dia João,

    Obrigado pelo seu interesse em ajudar.

    Deixa eu explicar o meu objetivo com esse algorítmo em C# :

    Estou planejando as mudanças que virão na NF-e com a inclusão dos dados do desenvolvedor.

    A primeira parte da conversão eu consegui com o comando: hb_sha1( codigo_exemplo ) que funciona perfeitamente e me retorna a chave "696bfa2de10ce17eaee3ea8123639867c82b8a0c" depois disso eu preciso converter essa chave para Base64 mas o problema é que o comando HB_Base64encode( "696bfa2de10ce17eaee3ea8123639867c82b8a0c" ) retorna "Njk2YmZhMmRlMTBjZTE3ZWFlZTNlYTgxMjM2Mzk4NjdjODJiOGEwYw==" e eu preciso que retorne "aWv6LeEM4X6u4+qBI2OYZ8grigw=". 

    Achei num fórum esse algoritmo em C# que pega o resultado do HB_Base64encode() e gera o código que eu preciso, mas não estou conseguindo fazer essa rotina em xHarbour.

    Você conhece alguma função que faça isso?

     

  5. Pessoal,

    Alguém, por favor, consegue converter essa função C para uso no xHarbour?

    private static string ToBase64Hex(string value)
    {
       int countChars = value.Length;
       byte[] bytes = new byte[countChars / 2];
    
      for(int i = 0; i < countChars; i+=2)
      {
         bytes[i / 2] = Convert.ToByte(value.Substring(i, 2), 16);
      }
    
      return Convert.ToBase64String(bytes);
    }

     

  6. Pessoal,

    Estou trabalhando com arquivos temporários em memória com o hb_dbcreate() assim:

       /////////////////////////////////////////////////
       // Arquivo Temporário, no xHarbour 1.2 Somente //
       // Cria o Arquivo na memória (não usa o Disco) //
       /////////////////////////////////////////////////
       Local _DbfTemp[1]:="ARQTEMP"
       Hb_DbCreate(_DbfTemp[1],{{ "Nombre",    "C", 40, 0 },; // -> Criação do Memory File Temporary com Hb_DbCreateTemp()
                               { "Direccion", "C", 50, 0 },;
                               { "Telefono",  "C", 12, 0 },;
                               { "Edad",      "N",  2, 0 },;
                               { "Productos", "C", 10, 0 },;
                               { "Nivel",     "N",  2, 0 }})
    
       // Seleciona o Arquivo criado na memória e usa os comandos comuns de tratamento dos registros //
       Select(_DbfTemp[1])
       OADbAppend()
       replace nombre    with "Oscar Ribeiro"
       replace Direccion with "RUA MARCIA PIERRONI, 99"
       replace Telefono  with "55 11 4025-1234"
       DbAppend()
       replace nombre    with "Marco Ribeiro"
       replace Direccion with "RUA MARCIA PIERRONI, 99"
       replace Telefono  with "55 11 4025-1234"
       DbAppend()
       replace nombre    with "Oscar Ribeiro Neto"
       replace Direccion with "RUA MARCIA PIERRONI, 99"
       replace Telefono  with "55 11 4025-1234"
       browse()
    
       // Cria o indice do arquivo também na memória //
       index on nombre to clientes Memory
       Seek "Marco Ribeiro"
       browse()
    
       // Fecha o arquivo e Apaga da Memória //
       (_DbfTemp[1])->(DBCLOSEAREA())
       oaDbDrop("MEM:"+_DbfTemp[1])

    Entendi que quando fecho o arquivo com DbCloseArea() o arquivo ainda continua na memória, porque eu consigo abrí-lo novamente com DbUseArea() mas preciso saber se existe algum comando que verifica se o arquivo ainda está lá.

    Por exemplo, se o arquivo é físico eu uso FILE("ARQTEMP.DBF"), mas com arquivo de memória, existe algum comando similar ao FILE() que verifica se ele está lá?

     

     

  7. Obrigado João,

    Mas essa função retorna a quantidade de campos de uma tabela, eu preciso do número de registros ativos dela.

    FCount: - The function returns a numeric value which is the number of field variables available in a work area. If a work area is not used, the return value is zero.

  8. Pessoal,

    Existe no xharbour alguma função que retorne apenas o número de registros filtrados numa tabela?

    O RecCount() e o LastRec() retornam o total de registros na tabela sem considerar o Scope nem o Filter. Existe algum outro comando que faça isso?

    Eu desenvolvi a função abaixo para fazer isso, mas se tiver um comando nativo é mellhor:

    ********************************************************************************************
    Function oaRecCount() // Calcula o número de registros ativos no arquivo (considera ordscope, setfilter, etc.)
    ********************************************************************************************
       Local nRec := 0
       Local nReg
       if Used()
          nReg := RecN()
          DbGoTop()
          Do While !Eof()
             SysRefresh()
             nRec = nRec + 1
             DbSkip()
          EndDo
          DbGoTo( nReg )
       endif
    Return( nRec )
    

     

  9. Pablo,

    Muito obrigado pelo seu comentário otimista sobre o SQLRDD. 

    Estou com a minha aplicação quase que 100% funcional com ele e estou gostando, tenho apenas algumas situações estranhas como a que mencionei na mensagem inicial desse tópico, mas aos poucos estou conseguindo driblá-las. Vou seguir com essa ferramenta porque foi a única forma que encontrei para mudar sem ter que reescrever muitos códigos que estão funcionando muito bem com DBFCDX. 

    Um abraço e votos de sucesso.

    Oscar Ribeiro

×
×
  • Create New...