APPEND

Discussão em 'Progress 4GL' iniciado por mcarril, Abril 7, 2011.

  1. mcarril

    mcarril Membro Participativo

    Pessoal, estou com um problema em que dois "usuários" ou "programas" geram informações para um mesmo arquivo. Se o enter for colocado no mesmo instante a linha fica sobreposta com os dois registros. Criamos dois programas para simular o erro, quando executados juntos um registro se sobrepoe ao outro.


    Programa1:

    DEF VAR x as char format "9999999".
    DEF VAR Y AS CHAR FORMAT "X(10)" INITIAL "bbbbbbbbbb".
    DEF VAR K AS CHAR FORMAT "X(15)" INITIAL "CCCCCCCCCCCCCCC".
    DEF VAR L AS CHAR FORMAT "x(10)" INITIAL "DDDDDDDDDD".

    DEF STREAM xx.
    OUTPUT STREAM xx TO ttt.txt APPEND.

    REPEAT:
    m = m + 1.
    x = STRING(m, "9999999")

    PUT STREAM xx
    x ";"
    y ";"
    k ";"
    l ";"
    "ffffffffffffffffffff".
    pause 1 no message.
    end.

    output stream xx close.


    PROGRAMA 2


    DEF VAR x as char format "9999999".
    DEF VAR Y AS CHAR FORMAT "X(10)" INITIAL "bbbbbbbbbb".
    DEF VAR K AS CHAR FORMAT "X(15)" INITIAL "CCCCCCCCCCCCCCC".
    DEF VAR L AS CHAR FORMAT "x(10)" INITIAL "DDDDDDDDDD".

    DEF STREAM xx.
    OUTPUT STREAM xx TO ttt.txt APPEND.

    REPEAT:
    m = m + 1.
    x = STRING(m, "9999999")

    PUT STREAM xx
    x ";"
    y ";"
    k ";"
    l ";"
    "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee".
    pause 2 no message.
    end.

    output stream xx close.

    Alguém sabe como resolver ?

    Agradeço
    Marly
  2. eduardo.leite

    eduardo.leite Equipe de Suporte Moderador Equipe de Suporte

    Marly,

    Pelo que sei, só tem 2 jeitos:

    01) Gravar em diretórios diferentes
    02) Gravar o arquivo com nomes diferentes, por exemplo ttt-<nome usuario>.txt
  3. mcarril

    mcarril Membro Participativo

    Olá Eduardo, muito obrigada pela sua sempre bem vinda e brilhante ajuda.
    O problema é que se trata de um arquivo com dados de Clientes. Cada alteração que os usuários de várias áreas fazem durante o dia geram um arquivo que à noite sobe para o arquivo geral de clientes do banco na alta plataforma.
    O problema é como utilizar o arquivo txt gerado com "exclusive-lock".
    A não ser que geramos os arquivos com o nome dos usuários durante o dia e a noite antes de enviar para a outra plataforma juntar os dados dos arquivos e enviar...
    Vou conversar com o pessoal para saber se isto é viável... Vai dar mais trabalho, mas se é o único jeito... Fazer o quê ? Vamos para frente .... rsrsrsrs...
    Obrigada.
    Marly
  4. eduardo.leite

    eduardo.leite Equipe de Suporte Moderador Equipe de Suporte

    Marly,

    Andei pesquisando na internet e consegui montar um código que você poderá adaptar a sua necessidade, o básico dele é o seguinte:

    01) Se o arquivo não existir irá criar um novo arquivo sem registros;
    02) Verifica se o arquivo está bloqueado:
    a) Está bloqueado, mostra mensagem informando para aguardar pois o arquivo está bloqueado para escrita;
    b) Não está bloqueado, abre o arquivo para a escrita e bloqueia ele;
    03) Terminou a escrita do arquivo libera ele e os outros usuários que estavam aguardando passam a escrever um de cada vez.

    Veja o código abaixo, execute-o em duas sessões distintas e você verá um exemplo do citado acima:

    Código:
    
    &global-define GENERIC_WRITE 1073741824   /* &H40000000 */
    &global-define OPEN_EXISTING 3
    &global-define FILE_SHARE_READ 1                  /* = &H1 */
    &global-define FILE_ATTRIBUTE_NORMAL 128       /* = &H80 */
    
    procedure CreateFileA external "kernel32":
        def input  param lpfilename                 as character.
        def input  param dwdesiredaccess            as long.
        def input  param dwsharemode                as long.
        def input  param lpsecurityattributes       as long.
        def input  param dwcreationdisposition      as long.
        def input  param dwflagsandattributes       as long.
        def input  param htemplatefile              as long.
        def return param returnvalue                as long.
    end procedure.
    
    procedure CloseHandle external "kernel32":
      def input    param hobject                    as long.
      def return   param returnvalue                as long.
    end procedure.
    
    def var lpsecurityatt                           as int      no-undo.
    def var hobject                                 as int      no-undo.
    def var nreturn                                 as int      no-undo.
    
    def var c-arquivo                               as char     no-undo.
    def var iContador                               as int      no-undo.
    
    assign c-arquivo = "c:/temp/arquivo.txt".
    
    file-info:file-name = c-arquivo.
    
    if file-info:full-pathname = ? then do:
        output to value(c-arquivo).
        output close.
        file-info:file-name = c-arquivo.
    end.
    
    /* Coloca o arquivo no modo de bloqueio */
    run CreateFileA (input c-arquivo, 
                     input {&GENERIC_WRITE}, 
                     {&FILE_SHARE_READ},
                     lpSecurityAtt, 
                     {&OPEN_EXISTING},
                     {&FILE_ATTRIBUTE_NORMAL},
                     0,
                     output hObject) no-error.
    
    repeat while hobject = -1:
        
        disp skip(2) "   Aguarde... Arquivo está sendo usado por outro usuário! " skip(2) with with frame x view-as dialog-box.
        
        pause 1.
    
        if hobject = -1 then
            /* Desbloqueia o arquivo */
            run closehandle (input hobject, 
                             output nreturn) no-error.
    
    /* Coloca o arquivo no modo de bloqueio */
        run CreateFileA (input c-arquivo, 
                         input {&GENERIC_WRITE}, 
                         {&FILE_SHARE_READ},
                         lpSecurityAtt, 
                         {&OPEN_EXISTING},
                         {&FILE_ATTRIBUTE_NORMAL},
                         0,
                         output hObject) no-error.
    
    end.
    
    hide frame x.
    
    /* Desbloqueia o arquivo */
    run closehandle (input hobject, 
                     output nreturn) no-error.
    
    output to value(c-arquivo) append.
    
    /* Coloca o arquivo no modo de bloqueio */
    run CreateFileA (input c-arquivo, 
                     input {&GENERIC_WRITE}, 
                     {&FILE_SHARE_READ},
                     lpSecurityAtt, 
                     {&OPEN_EXISTING},
                     {&FILE_ATTRIBUTE_NORMAL},
                     0,
                     output hObject) no-error.
    
    put "Iniciando Arquivo - Programa 01" skip.
    
    do iContador = 1 to 15:
    
        put iContador   format "999"            " "
            today       format "99/99/9999"     " "
            string(time,"hh:mm:ss")             " "
            "Escrevendo no Arquivo Handle " hobject skip.
    
        pause 1.
    
    end.
    
    output close.
    
    /* Desbloqueia o arquivo */
    run closehandle (input hobject, 
                     output nreturn) no-error.
    
    message "Arquivo Liberado" view-as alert-box.
    
    
  5. diego.simao

    diego.simao Sem Pontuação

    Olá Marley

    Só uma pergunta, você quer controlar o que foi alterado por cada área é isso ?


    Diego.Simao.
  6. mcarril

    mcarril Membro Participativo

    Não Diego, é que varios usuários acessam o meso arquivo e quando acessam juntos sobrepõe a linha.

Compartilhe esta Página