Erro de Argument

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Erro de Argument

Mensagem por Josmar dos Santos »

Por que está ocorrendo esse erro, para mim está ok

Argument error:=

Código: Selecionar todos

FUNCTION SALVAR01( TIPO_ACAO )
LOCAL lRetorno := .F.
IF TIPO_ACAO = INCLUSAO // Nesse local está ocorrendo o erro
   CLIENTES->( DbAppend() )  
   cCOD_CLI := alltrim( STRZERO( PSQCONTROLE( "clientes" ), 5 ) )  
   CLIENTES->COD_CLI := cCOD_CLI
   alert("Numero gerado no arquivo: " +cCOD_CLI)
ELSE
   CLIENTES->( Rlock() )
ENDIF   
If .Not. NetErr()       
   CLIENTES->NOM_CLI := M->NOM_CLI
   CLIENTES->DAT_CLI := M->DAT_CLI
   CLIENTES->V_CLI   := M->V_CLI
   CLIENTES->OBS_CLI := M->OBS_CLI
   CLIENTES->( DbCommit() )
   CLIENTES->( DbUnLock() )
Else
   Alert( "Falha ao incluir novo cliente." )
Endif
Return .T.
Só um detalhe: esse ocorre na hora de eu fazer uma eventual alteração. No cadastro está normal !
Favor, verificar o q está incorreto

Josmar
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Erro de Argument

Mensagem por ANDRIL »

Amigo, fica um pouco dificil saber sem ver o codigo completo, mais acho que o erro sera corrigido se alterar a linha:
IF TIPO_ACAO = INCLUSAO // Nesse local está ocorrendo o erro
para
IF TIPO_ACAO = "INCLUSAO" // Nesse local está ocorrendo o erro
Boa sorte.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Erro de Argument

Mensagem por Maligno »

Eu acho que esse parâmetro não deve ser do tipo char (pelo menos espero que não). Mas o colega precisaria postar as chamadas dessa função. A que dá certo, e a que dá errado. Aí sim, ficaria mais fácil entender o que ocorre.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Re: Erro de Argument

Mensagem por Josmar dos Santos »

Ok ! Aqui está como ambos pediram

Rotina de Inclusão, que da certo:

Código: Selecionar todos

nclude "OFIC.CH"
LOCAL CONTAR
RE_GISTROS:={}

IF !ABRECLI()
   ALERT("NAO CONSEGUI ABRIR")
ENDIF


M->MOSTRA_RESULTADO := .F.
PRIVATE ME_MO, COD_CLI, NOM_CLI, DAT_CLI, V_CLI, OBS_CLI,cCOD_CLI
WHILE .T.
   MENSAGEM( "Tecle <ESC> para retornar" )
   CARREG01( INCLUSAO )
   M->MOSTRA_RESULTADO := .T.
   IF CARGET01( INCLUSAO )=.F.
      EXIT
   ENDIF
   IF PERG( "Confirma as informa‡”es ?" ) = "N"
      LOOP
   ENDIF
   M->MOSTRA_RESULTADO := .F.
   SALVAR01( INCLUSAO )
   COMMIT
   UNLOCK
ENDDO
RESTSCREEN( LIN_MENU + 1, 00, 23, 79, TELA_PRI )

FUNCTION CARREG01( TIPO_ACAO )
M->ME_MO := "[OBS_CLI]" 
IF TIPO_ACAO = INCLUSAO
   GOTO BOTTOM          
   SKIP
ENDIF
M->COD_CLI := CLIENTES->COD_CLI
M->NOM_CLI := CLIENTES->NOM_CLI
M->DAT_CLI := CLIENTES->DAT_CLI
M->V_CLI   := CLIENTES->V_CLI
M->OBS_CLI := CLIENTES->OBS_CLI
IF TIPO_ACAO = INCLUSAO
   M->DAT_CLI:=DATE()
ENDIF
RETURN .T.

FUNCTION CARGET01( TIPO_ACAO )
IF TIPO_ACAO != MOSTRA_PAG_1
   M->AL_TERAR := .F.
ENDIF
JANELA( 3, 3, 16, 63, "CLIENTES" )
@  4,  4 TO 15, 62 DOUBL
COR( "GETS" )
@  4, 22 SAY "CADASTRO DE CLIENTES"
@  6, 29 SAY "DATA:" GET M->DAT_CLI
@  9,  7 SAY "NOME..:" GET M->NOM_CLI PICTURE "@!"
@ 12,  7 SAY "VALOR.:" GET M->V_CLI PICTURE "@Z 9,999,999.99"
@ 12, 35 SAY "OBS:" GET ME_MO PICT "9memo]" VALID EDITOR( @OBS_CLI, "OBS:" )
IF TIPO_ACAO = MOSTRA_PAG_1
   CLEAR GETS
   RETURN .F.
ENDIF
IF TIPO_ACAO = CONSULTA .OR. TIPO_ACAO = EXCLUSAO
   CLEAR GETS
   IF TIPO_ACAO = EXCLUSAO
      RETURN .T.
   ENDIF
   MENSAGEM( "Tecle algo para continuar" )
   IF INKEY( 0 ) = T_ESC
      RETURN .F.
   ENDIF
   EDITOR( OBS_CLI, "OBS:", .F. )
ELSE
   CURSOR( LIGA )
   READ
   CURSOR( DESLIGA )
   IF LASTKEY() = T_ESC
      RETURN .F.
   ENDIF
ENDIF
RETURN .T.

FUNCTION SALVAR01( TIPO_ACAO )
LOCAL lRetorno := .F.
IF TIPO_ACAO = INCLUSAO
   CLIENTES->( DbAppend() )  
   cCOD_CLI := alltrim( STRZERO( PSQCONTROLE( "clientes" ), 5 ) )  
   CLIENTES->COD_CLI := cCOD_CLI
   alert("Numero gerado no arquivo: " +cCOD_CLI)
ELSE
   CLIENTES->( Rlock() )
ENDIF   
If .Not. NetErr()       
   CLIENTES->NOM_CLI := M->NOM_CLI
   CLIENTES->DAT_CLI := M->DAT_CLI
   CLIENTES->V_CLI   := M->V_CLI
   CLIENTES->OBS_CLI := M->OBS_CLI
   CLIENTES->( DbCommit() )
   CLIENTES->( DbUnLock() )
Else
   Alert( "Falha ao incluir novo cliente." )
Endif
Return .T.

Rotina de Alteração que não da certo:

Código: Selecionar todos

#include "OFIC.CH"
SET DELETED OFF
M->MOSTRA_RESULTADO := .T.
IF !ABRECLI()
   ALERT("NAO CONSEGUI ABRIR")
ENDIF
ORDSETFOCUS("CLIENT_1")
PRIVATE ME_MO, COD_CLI, NOM_CLI, DAT_CLI, V_CLI, OBS_CLI,cCOD_CLI
@ LIN_MENU, 00
@ LIN_MENU,01 SAY "Manuten‡„o ³ CODIGO"
JANELA( 03, 02, 21, 77, "CODIGO" )
@ 05, 04 CLEAR TO 19, 75
@ 05, 04 SAY SUBS( TB_JANELA, 1, 1 ) +;
             REPL( SUBS( TB_JANELA, 2, 1 ), 70 ) + SUBS( TB_JANELA, 3, 1 )
@ 06, 04 SAY SUBS( TB_JANELA, 12, 1 )
@ 06, 75 SAY SUBS( TB_JANELA, 4, 1 )
@ 07, 04 SAY SUBS( TB_JANELA, 11, 1 )
@ 07, 75 SAY SUBS( TB_JANELA, 5, 1 )
FOR CONTAR = 8 TO 18
   @ CONTAR, 04 SAY SUBS( TB_JANELA, 10, 1 )
   @ CONTAR, 75 SAY SUBS( TB_JANELA, 6, 1 )
NEXT
@ 19, 04 SAY SUBS( TB_JANELA, 9, 1 ) +;
             REPL( SUBS( TB_JANELA, 8, 1 ), 70 ) + SUBS( TB_JANELA, 7, 1 )
ROTI_NAS := { { | X | CARREG01( X ) },;
              { | X | CARGET01( X ) },;
              { || SALVAR01( X ) } }
GRA_VAR := {}
OB_COLUN := {}
AADD( OB_COLUN, TBCOLUMNNEW( "CODIGO:", { ||  CLIENTES->COD_CLI } ) )
AADD( OB_COLUN, TBCOLUMNNEW( "NOME:", { ||  CLIENTES->NOM_CLI } ) )
AADD( OB_COLUN, TBCOLUMNNEW( "DATA:", { ||  CLIENTES->DAT_CLI } ) )
AADD( OB_COLUN, TBCOLUMNNEW( "VALOR:", { || TRAN(  CLIENTES->V_CLI, "@Z 9,999,999.99" ) } ) )
BRO_WSE( .T. )
M->COD_CLI := SPACE( 5 )
ED_JAN := {}
AADD( ED_JAN, { "DIGITE O CODIGO:", M->COD_CLI, "@!", 5,;
      { | DADOS | M->COD_CLI := DADOS } } )
WHILE .T.
   IF EDIT_JAN( ED_JAN ) = .F.
      EXIT
   ENDIF
   SEEK TRIM( M->COD_CLI )
   IF EOF()
      BEEP()
      MENSAGEM( "Dados n„o encontrados", 3 )
      LOOP
   ENDIF
   MENSAGEM( "Posicione sobre o registro desejado e tecle <ENTER>" )
   BRO_WSE()
ENDDO
SET DELETED ON
RESTSCREEN( LIN_MENU + 1, 00, MAXROW() - 1, MAXCOL(), TELA_PRI )
SET DELETED ON
Como eu disse, na inclusão não corre o erro, porém quando faço uma alteração na manutenção do sistema ocorre o presente erro.
Andril, obrigado pela dica, mas infelismente não funcionou !!!
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Erro de Argument

Mensagem por Maligno »

Eu até poderia dizer que o erro está na linha 25, na composição da matriz "ROTI_NAS". Mas essa matriz, ao que parece, nem está sendo utilizada nesse arquivo. Mas veja o o terceiro bloco de código que ela recebe:

{ || SALVAR01( X ) }

Dá a entender que a função SALVAR01 está sendo chamada com um NIL ao invés do argumento correto que, imagino, deve ser numérico. Ainda não posso dizer com certeza, mas dou uma dica: use o debugger e pare na terceira linha da função "SALVAR01". Sou capaz de apostar que o argumento está chegando como NIL.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Erro de Argument

Mensagem por ANDRIL »

Mesmo sem saber a origem da var INCLUSAO (se é numerica ou é uma constante ) veja na linha:

25 ROTI_NAS := { { | X | CARREG01( X ) },;
26 { | X | CARGET01( X ) },;
27 { | X | SALVAR01( X ) } }
Todas as demais funcoes recebiam o parametro, menos esta.

Boa sorte
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Erro de Argument

Mensagem por Pablo César »

Josmar, na sua tentativa de alteração você está utilizando a função EDIT_JAN que está sendo chamado no módulo de manutenção, isto você adicionou essa chamada manualmente ou de alguma forma o Miro implementou para você ?. Pois pelo que eu tive testando, não conseguí com que o Miro implementasse essa função. E mesmo que seja normal a utilização dessa função, parece-me que deveria tratar o retorno .F. da EDIT_JAN, pois na linha 41 está sendo executado um EXIT o que forçaria a saída da "consulta/edição".

Você verificou o OFICCON.PRG onde encontra-se a função BRO_WSE na linha onde trata essa opção de ALTERACAO ?

Se o seu sistema não foi feito nenhuma alteração manual do código, você deveria gerar novamente os fontes para que essa opção seja restaurada em algum módulo que esteja incompleta a opção.

As vezes entender e alterar um código feito por geradores, dão mais trabalho do que fazer na unha uma rotina própria do programador. Pois teríamos que verificar as alterações que você implementou por ultimo.

Esse erro dá após a edição dos campos ou esse erro nem sequer permite a apresentação dos GETs ?
andril escreveu:Mesmo sem saber a origem da var INCLUSAO (se é numerica ou é uma constante )
É uma constante definida no arquivo de diretivas de pre-processador (neste caso o OFIC.CH). Aliás, falando disso, verifique se nesse arquivo ch existe tal definição para a constante ALTERACAO.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Re: Erro de Argument

Mensagem por Josmar dos Santos »

Pablo, esse sistema é um pouco antigo, foi feito em 1996 quando comecei a estudar clipper. Eu trabalho com poucos clientes, no máximo 4 , no qual 3 foram feitos na unha, e também não quero muitos porque não tenho muito tempo para me dedicar como eu queria. Esse sistema que foi gerado na época, é muito grande, possuí em torno de 220 prgs. Já tentei convence o usuário até a mudar para uma outra Empresa que pudesse dar mais segurança a ele, mas ele não quer ! Agora não vale a pena querer mudar esse sistema na unha, imagine o trampo que iria dar e o custo disso ! Então vou fazendo uma coisinha ali, outra ali e aí vai !Quanto aos outros sistemas feito na unha só utilizei a tela principal do Miro3.
Quanto as modificações, foram feitos sim algumas pequenas alterações:
A função Salvar não e original do MIro3
Essa seria a original:

Código: Selecionar todos

FUNCTION SALVAR01
   CLIENTES->COD_CLI := M->COD_CLI
   CLIENTES->NOM_CLI := M->NOM_CLI
   CLIENTES->DAT_CLI := M->DAT_CLI
   CLIENTES->V_CLI   := M->V_CLI
   CLIENTES->OBS_CLI := M->OBS_CLI

Também não e usada as funções originais do miro de abertura e indexação de rede.
Essas são as atuais que um colega aqui mesmo do forum me passou:

Código: Selecionar todos

FUNCTION ABRECLI
IF USA("CLIENTES",.T.,.F.)
   IF(!FILE("CLIENTES.CDX"))
     _FECHA()
     INDEX ON COD_CLI TAG CLIENT_1 TO CLIENTES
     INDEX ON NOM_CLI TAG CLIENT_2 TO CLIENTES
     _ABRE()
   ENDIF
   DBSETINDEX("CLIENTES")
ELSE
   MENSAGEM( "Troca de n¡vel mal sucedida", 3 )
   RETURN .F.
ENDIF
RETURN .T.


FUNCTION USA(ARQUIVO,SH,RO)
IF SH
   USE &ARQUIVO SHARED NEW
ELSE
   USE &ARQUIVO EXCLUSIVE NEW
ENDIF
IF !NETERR()
   memory(0)
   RETURN .T.
ELSE
   RETURN .F.
ENDIF

FUNCTION _FECHA
LOCAL WDBF
WDBF = ALIAS()
CLOSE &WDBF
USA(WDBF,.F.,.F.)
RETURN

FUNCTION _ABRE
LOCAL WDBF
WDBF = ALIAS()
CLOSE &WDBF
USA(WDBF,.T.,.F.)
RETURN


FUNCTION INDICET
IF .NOT. FILE("CLIENTE.CDX") .OR. PCOUNT()<>0
   USE CLIENTES
   MENSAGEM("Organizando o arquivo CLIENTE.CDX")
   INDEX ON COD_CLI TAG CLIENT_1 TO CLIENTE
   INDEX ON NOM_CLI TAG CLIENT_2 TO CLIENTE
ENDIF
IF .NOT. FILE("FORNE.CDX") .OR. PCOUNT()<>0
   USE FORNECED
   MENSAGEM("Organizando o arquivo FORNE.CDX")
     INDEX ON COD_FOR TAG FORNE_1 TO FORNE
     INDEX ON DTOS(DAT_FOR) TAG FORNE_2 TO FORNE
     INDEX ON NOM_FOR TAG FORNE_3 TO FORNE
ENDIF
USE


FUNCTION PsqControle( database )
   nControle := iif( recco()=0, 1, recco()+(recco()/4) )
   OldArea := Select()
   if !file( "CONTROLE.DBF" )
      ESTRU_DBF := { { "DATABASE"  , "C",12, 0 } , ;
                     { "CONTADOR"  , "N", 5, 0 } }    // Controle de FINANCEIRO
      DBCREATE( "CONTROLE", ESTRU_DBF )
   endif
   If Select("CONTROLE") == 0
      USE controle NEW
   Else
      DbSelectar("CONTROLE")
   EndIf
   LOCATE FOR UPPER(controle->database) = UPPER(database)
   if found()
      nControle := controle->contador + 1
      RLOCK()
      controle->contador := nControle
      COMMIT
   else
      APPEND BLANK
      controle->database := database
      controle->contador := nControle
      COMMIT
   endif
   SELE (OldArea)
   RETURN nControle



Quanto erro sobre os gets, passa sim pelos Gets, só ocorre quando confirmo as informações, Mas irei sim gerar novamente para fazer teste como vc mencionou !!!


Essas foram as unicas alterações, no browse, não mechi em nada !

Josmar
Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Re: Erro de Argument

Mensagem por Josmar dos Santos »

Ola, so para completar a mensagem, tanto a var "Inclusao" e "Alteração" são constantes


Josmar
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Erro de Argument

Mensagem por rochinha »

Amiguinho Josmar,

Voce não seguiu minhas recomendações nem a sequencia dos códigos que lhe passei.

Voce continua incorrendo em obter falhas na numeração sequencial.

Código: Selecionar todos

FUNCTION SALVAR01( TIPO_ACAO )
LOCAL lRetorno := .F.
IF TIPO_ACAO = INCLUSAO // Nesse local está ocorrendo o erro
   CLIENTES->( DbAppend() )  
   cCOD_CLI := alltrim( STRZERO( PSQCONTROLE( "clientes" ), 5 ) )  
   CLIENTES->COD_CLI := cCOD_CLI
   alert("Numero gerado no arquivo: " +cCOD_CLI)
ELSE
   CLIENTES->( Rlock() )
ENDIF   
If .Not. NetErr()       
   CLIENTES->NOM_CLI := M->NOM_CLI
   CLIENTES->DAT_CLI := M->DAT_CLI
   CLIENTES->V_CLI   := M->V_CLI
   CLIENTES->OBS_CLI := M->OBS_CLI
   CLIENTES->( DbCommit() )
   CLIENTES->( DbUnLock() )
Else
   Alert( "Falha ao incluir novo cliente." )
Endif
Return .T.

Código: Selecionar todos

FUNCTION SALVAR01( TIPO_ACAO )
LOCAL lRetorno := .F.
IF TIPO_ACAO = INCLUSAO // Nesse local está ocorrendo o erro
A variavel INCLUSAO existe no inicio do .PRG principal e deve conter um numero que a defina, como 1, exemplo.

Código: Selecionar todos

   CLIENTES->( DbAppend() )  
   cCOD_CLI := alltrim( STRZERO( PSQCONTROLE( "clientes" ), 5 ) )  
   CLIENTES->COD_CLI := cCOD_CLI
   alert("Numero gerado no arquivo: " +cCOD_CLI)
Acima voce insiste em manter o erro de numerar o registro sem antes salva-lo.

Código: Selecionar todos

ELSE
   CLIENTES->( Rlock() )
ENDIF   
If .Not. NetErr()       
   CLIENTES->NOM_CLI := M->NOM_CLI
   CLIENTES->DAT_CLI := M->DAT_CLI
   CLIENTES->V_CLI   := M->V_CLI
   CLIENTES->OBS_CLI := M->OBS_CLI
   CLIENTES->( DbCommit() )
   CLIENTES->( DbUnLock() )
Else
   Alert( "Falha ao incluir novo cliente." )
Endif
Return .T.
Se NetErr() não tiver exito voce tera um furo na numeração de um registro que voce acrescentou e não finalizou.

No trecho abaixo voce incluiu chamadas que nunca serão usadas neste local:

Código: Selecionar todos

@ 19, 04 SAY SUBS( TB_JANELA, 9, 1 ) +;
             REPL( SUBS( TB_JANELA, 8, 1 ), 70 ) + SUBS( TB_JANELA, 7, 1 )
ROTI_NAS := { { | X | CARREG01( X ) },;
              { | X | CARGET01( X ) },;
              { || SALVAR01( X ) } }
GRA_VAR := {}
OB_COLUN := {}
AADD( OB_COLUN, TBCOLUMNNEW( "CODIGO:", { ||  CLIENTES->COD_CLI } ) )
AADD( OB_COLUN, TBCOLUMNNEW( "NOME:", { ||  CLIENTES->NOM_CLI } ) )
AADD( OB_COLUN, TBCOLUMNNEW( "DATA:", { ||  CLIENTES->DAT_CLI } ) )
AADD( OB_COLUN, TBCOLUMNNEW( "VALOR:", { || TRAN(  CLIENTES->V_CLI, "@Z 9,999,999.99" ) } ) )
BRO_WSE( .T. )
A variavel ROTI_NAS é na verdade um parametro da função que criei para minimizar a codificação em questão e ela recebe um vetor de codeblock que serão avaliados dentro da função CADASTRA() e somente nela.

Código: Selecionar todos

FUNCTION CADASTRA( TI_TULO, ROTI_NAS, OR_DER, DBF_ON )

Código: Selecionar todos

CADASTRA( "Inclusao", { { | X | CARREGI1( X ) },;
                        { | X | CARGETI1( X ) },;
                        { || SALVARI1( X ) }   ,;
                        { || M->COD_CLI := alltrim( STRZERO( PSQCONTROLE( "clientes" ), 5 ) ) },;
                        { || !EMPTY( M->NOM_CLI ) };
                      } )
A rotina de cadastramento completa esta logo abaixo e funciona perfeitamente pois a coloquei dentro de seu sistema e deixei uma opção no menu para que voce avaliasse.

Código: Selecionar todos

/*
 * TITULO     : Sistema de Oficina
 * DATA       : 25/08/2010
 * PROGRAMA   : OFICI01D.PRG
 * COMENTARIO : CADASTRO (Clientes)
 */
#include "OFIC.CH"

// Usando este comando extendido, caso tenha esquecido alguma tabela aberta
// nao acontecera erro de abertura, a nao ser que a mesma esteja aberta em 
// modo exclusivo
#command OPEN <(db)>                                                    ;
             [VIA <rdd>]                                                ;
             [ALIAS <a>]                                                ;
             [<new: NEW>]                                               ;
             [<ex: EXCLUSIVE>]                                          ;
             [<sh: SHARED>]                                             ;
             [<ro: READONLY>]                                           ;
             [INDEX <(index1)> [, <(indexn)>]]                          ;
       => iif( Select( <(db)> )==0, iif( !File( <(db)>+".CDX" ), ( Alert( "Arquivo "+<(db)>+" esta sem indices. Abrindo sem indices. Reorganiza primeiro" ), dbNetUseArea( <.new.>, <rdd>, <(db)>, <(a)>, if(<.sh.> .or. <.ex.>, !<.ex.>, NIL), <.ro.>, 0 ) ), ( dbNetUseArea( <.new.>, <rdd>, <(db)>, <(a)>, if(<.sh.> .or. <.ex.>, !<.ex.>, NIL), <.ro.>, 0 ), dbSetIndex( <(db)> ) ) ), ( dbSelectArea( <(db)> ) ) )

MENSAGEM( "Aguarde abertura de arquivos" )
OPEN clientes SHARED NEW
    SELECT CLIENTES
    SET ORDER TO 1

COR( "MENU" )
@ LIN_MENU, 00
@ LIN_MENU, 01 SAY "Cadastro - Clientes"

M->DU_PLICIDADE     := .F. // Testa duplicidade
M->MOSTRA_RESULTADO := .F. // Apresenta dados
M->IN_CLUIR         := .T. // Sempre preparado para inclusao
M->AL_TERAR         := .F. // Sempre preparado para inclusao

// Privatiza as variaveis de nomes de campos
PRIVATE ME_MO, COD_CLI, NOM_CLI, DAT_CLI, V_CLI, OBS_CLI

SET DELETED ON
SET KEY 22 TO

// Usando esta funcao customizada voce diminui o tempo de programacao
// bastando apenas focar a codificacao nas funcoes de CARREGamento, GETamento
// SALVARmento e criticas
CADASTRA( "Inclusao", { { | X | CARREGI1( X ) },;
                        { | X | CARGETI1( X ) },;
                        { || SALVARI1( X ) }   ,;
                        { || M->COD_CLI := alltrim( STRZERO( PSQCONTROLE( "clientes" ), 5 ) ) },;
                        { || !EMPTY( M->NOM_CLI ) };
                      } )

STATIC ; // Coloquei estas funcoes como STATIC para que sejam visualizadas somente aqui neste PRG
FUNCTION VERI0I1( TIPO_ACAO )
   //
   // -> Funcao que verifica duplicidade no arquivo
   LOCAL REGISTRO := RECN(), ORDEM := INDEXORD()
   SET ORDER TO 2
   SEEK M->NOM_CLI
   IF !EOF()
      IF REGISTRO = RECN()
         SET ORDER TO ORDEM
         RETURN .T.
      ENDIF
      IF TIPO_ACAO = INCLUSAO
         BEEP(); MENSAGEM( "Registro ja cadastrado", 3 )
         GOTO REGISTRO
         RETURN .F.
      ELSE
         M->AL_TERAR := .T.
         CLEAR GETS
         SET ORDER TO ORDEM
         RETURN .T.
      ENDIF
   ELSE
   ENDIF
   SET ORDER TO ORDEM
   GOTO REGISTRO
   RETURN .T. // Uma coisa muito feia na programacao com MIRO e a falta desta finalizacao

STATIC ; // Coloquei estas funcoes como STATIC para que sejam visualizadas somente aqui neste PRG
FUNCTION CARREGI1( TIPO_ACAO )
   //
   // -> Carrega variaveis para entrada ou alteracao de dados
   IF TIPO_ACAO = INCLUSAO
      GOTO BOTTOM
      SKIP
   ENDIF
   M->COD_CLI := CLIENTES->COD_CLI
   M->NOM_CLI := CLIENTES->NOM_CLI
   M->DAT_CLI := CLIENTES->DAT_CLI
   M->V_CLI   := CLIENTES->V_CLI
   M->OBS_CLI := CLIENTES->OBS_CLI
   IF TIPO_ACAO = INCLUSAO
      M->DAT_CLI := DATE()
   ENDIF

STATIC ; // Coloquei estas funcoes como STATIC para que sejam visualizadas somente aqui neste PRG
FUNCTION CARGETI1( TIPO_ACAO )
   //
   // -> Formata a tela para entrada ou alteracao de dados
   IF TIPO_ACAO != ALTERACAO
      M->AL_TERAR := .F.
   ENDIF
   JANELA( 3, 5, 8, 66, "Registro" )
   COR( "GETS" )
   //
   // -> Monta tela de cadastro
   @  4,  7 SAY "DATA..:" GET M->DAT_CLI
   @  5,  7 SAY "NOME..:" GET M->NOM_CLI PICTURE "@!" VALID VERI0I1( TIPO_ACAO )
   @  6,  7 SAY "VALOR.:" GET M->V_CLI   PICTURE "@Z 9,999,999.99"
   @  7,  7 SAY "OBS...:" GET ME_MO PICT "9memo]" VALID EDITOR( @OBS_CLI, "OBS:" )
   IF TIPO_ACAO = ALTERACAO
      CLEAR GETS
      RETURN .F.
   ENDIF
   IF TIPO_ACAO = CONSULTA .OR. TIPO_ACAO = EXCLUSAO
      CLEAR GETS
      IF TIPO_ACAO = EXCLUSAO
         RETURN .T.
      ENDIF
      MENSAGEM( "Tecle algo para continuar" )
      IF LASTKEY() = T_ESC
         RETURN .F.
      ENDIF
   ELSE
      CURSOR( LIGA )
      READ
      CURSOR( DESLIGA )
      IF M->AL_TERAR
         RETURN .F.
      ENDIF
      IF LASTKEY() = T_ESC
         RETURN .F.
      ENDIF
   ENDIF
   RETURN .T. // Uma coisa muito feia na programacao com MIRO e a falta desta finalizacao

STATIC ; // Coloquei estas funcoes como STATIC para que sejam visualizadas somente aqui neste PRG
FUNCTION SALVARI1( TIPO_ACAO )
   // -> Salva o conteudo das variaveis de entrada no arquivo
   CLIENTES->COD_CLI := M->COD_CLI
   CLIENTES->NOM_CLI := M->NOM_CLI
   CLIENTES->DAT_CLI := M->DAT_CLI
   CLIENTES->V_CLI   := M->V_CLI
   CLIENTES->OBS_CLI := M->OBS_CLI
   CLIENTES->( DbCommit() )
   CLIENTES->( DbUnLock() )
   RETURN .T. // Uma coisa muito feia na programacao com MIRO e a falta desta finalizacao

/* Final do programa OFICII01R.PRG */

/*
 * TITULO     : Funcoes de Cadastro Customizada
 * DATA       : 25/08/2010
 * PROGRAMA   : NFWLIB.PRG
 * COMENTARIO : Funcoes de cadastramento customizadas pelo usuario
 */
FUNCTION CADASTRA( TI_TULO, ROTI_NAS, OR_DER, DBF_ON )
PUBLIC RE_GISTRO
COR( "MENU" )
@ LIN_MENU, 00
@ LIN_MENU, 01 SAY "Cadastro ³ "+TI_TULO
SAVE SCREEN TO CA_DASTRO
FUNDO(15)
IF DBF_ON = NIL
   DO WHILE .T.
      MENSAGEM( "Tecle <ESC> para retornar" )
      IF !( M->DU_PLICIDADE )
         SET ORDER TO IIF(OR_DER=NIL,2,OR_DER)
         //
         // -> Inicializa variaveis
         EVAL( ROTI_NAS[ 1 ], INCLUSAO )
      ELSE
         M->MOSTRA_RESULTADO := .T.
      ENDIF
      //
      // -> Carrega tela de cadastro
      IF EVAL( ROTI_NAS[ 2 ], IIF( M->AL_TERAR, ALTERACAO, INCLUSAO ) ) = .F.
         IF M->AL_TERAR
            EVAL( ROTI_NAS[ 1 ], ALTERACAO )
            M->MOSTRA_RESULTADO = .T.
            EVAL( ROTI_NAS[ 2 ], MOSTRA_PAG_1 )
            BEEP()
            IF PERG( "Registro j  cadastrado. Deseja alterar ?" ) = "S"
               M->IN_CLUIR := .F.; M->DU_PLICIDADE := .T.
               RE_GISTRO := RECN() // REGLOCK
            ELSE
               M->AL_TERAR := .F.
            ENDIF
            LOOP
         ENDIF
         EXIT
      ENDIF
      IF PERG( "Confirma as informa‡”es ?" ) = "N"
         //
         // -> Faz reedicao
         M->DU_PLICIDADE := .T.
         LOOP
      ENDIF
      M->DU_PLICIDADE := .F.
      M->MOSTRA_RESULTADO := .F.
      IF M->IN_CLUIR
         EVAL( ROTI_NAS[ 4 ] )
         IF EVAL( ROTI_NAS[ 5 ] ) = .T.
            APPEND BLANK
         ELSE
            BEEP(); BEEP()
            MENSAGEM('Registro deve possuir informa‡”es corretas.',5)
         ENDIF
      ELSE
         GO RE_GISTRO
         M->IN_CLUIR := .T.
         RLOCK()
      ENDIF
      //
      // -> Atualiza o banco de dados
      EVAL( ROTI_NAS[ 3 ] )
   ENDDO
   CLOSE DATABASES
ELSE
   EVAL( ROTI_NAS[ 1 ], INCLUSAO )
   EVAL( ROTI_NAS[ 2 ], INCLUSAO )
   IF PERG( "Confirma as informa‡”es ?" ) = "N"
      //
      // -> Faz reedicao
      RETURN
   ENDIF
   EVAL( ROTI_NAS[ 4 ] )
   IF EVAL( ROTI_NAS[ 5 ] ) = .T.
      APPEND BLANK
   ELSE
      BEEP(); BEEP()
      MENSAGEM('Registro deve possuir informa‡”es corretas.',5)
   ENDIF
   //
   // -> Atualiza o banco de dados
   EVAL( ROTI_NAS[ 3 ] )
ENDIF
REST SCREEN FROM CA_DASTRO
RETURN .T.
A formatação deste código é do tipo recorta-e-cola, ou seja, é um protótipo para que voce use o mesmo corpo para vários outros .DBFs modificando somente os trecho que compreendem a abertura das tabelas, os GETs na função CARGETXX() e os campos e variaveis nas funções CARREGXX() e SALVARXX().

Com certeza a outra recomendação de alteração fique por conta da eliminação das linhas que contém EVAL( ROTI_NAS[ 4 ] ) dentro da função CADASTRA() e a alteração do seguintes trechos:

Código: Selecionar todos

      ...
      //
      // -> Atualiza o banco de dados
      EVAL( ROTI_NAS[ 3 ] )
   ...
   //
   // -> Atualiza o banco de dados
   EVAL( ROTI_NAS[ 3 ] )
   ...
Para:

Código: Selecionar todos

      ...
      //
      // -> Atualiza o banco de dados
      If .Not. NetErr()       
         IF M->IN_CLUIR // Se for INCLUSAO pega novo codigo
            EVAL( ROTI_NAS[ 4 ] )
         Endif
         EVAL( ROTI_NAS[ 3 ] )
      Endif
   ...
   //
   // -> Atualiza o banco de dados
   If .Not. NetErr()       
      IF M->IN_CLUIR // Se for INCLUSAO pega novo codigo
         EVAL( ROTI_NAS[ 4 ] )
      Endif
      EVAL( ROTI_NAS[ 3 ] )
   Endif
   ...
Desta forma, se não houver problema com NetErr() o código não saltará.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Re: Erro de Argument

Mensagem por Josmar dos Santos »

OK Rochinha, conforme sua orientações e de outros colegas, esse assunto foi resolvido. Obrigado a todos e que deus os abençoe !

Josmar
Responder