Clipper On Line • Ver Tópico - Erro de tabela dbf
Mudar para estilo Clássico
Discussão sobre a biblioteca Fivewin - O Clipper para Windows.
Postar uma resposta

Erro de tabela dbf

16 Dez 2016 10:26

error3.txt
(10.52 KiB) Baixado 94 vezes
error2.txt
(16.63 KiB) Baixado 78 vezes
error1.txt
(16.45 KiB) Baixado 72 vezes
Pessoal ta ocorrendo varios erros em uma tabela q utilizo
erros como: Alias não exist ou campo não existe ou Workarea not in use

so que ja verifiquei na tabela se o campo existe,ja coloquei um comando para abrir a tabela caso ela não esteja em aberto

não sei mais oq fazer,se alguém puder me dar uma orientação.

Código:
if !FLPARG->(used())
        USE ("C:\mfolha\flparg.dbf") SHARED alias (flparg)
   endif   
   ::VIRRF -= (FLFUNC->DEDIRRF * FLPARG->DEDUCAO)


o erro ocorre no: FLPARG->DEDUCAO

Erro de tabela dbf

16 Dez 2016 12:15

Daiane, dúvida:

O programa esta em:

Código:
C:\mfolhawin\ImpVContraCheque.prg => IMPVCONTRACHEQUE:USEDB( 115 )


E os bancos em?

Código:
USE ("C:\mfolha\flparg.dbf") SHARED alias (flparg)


não concordo com esta logica mas, se isso está certo... Eu faria assim:

Código:
USE ("C:\mfolha\flparg.dbf") SHARED NEW alias flparg


Vá informando. Tem boi na linha.

Erro de tabela dbf

16 Dez 2016 17:34

Pior q ta assim mesmo os fontes em um diretório e os dbf em outros
ja peguei o sistema funcionando assim

Erro de tabela dbf

18 Dez 2016 21:53

Olá!

O trecho de código é pequeno e não permite uma análise mais abrangente. Notei que você não utiliza a cláusula NEW no comando USE. Pode ser que estejas a abrir vários arquivos em sequência, sem a cláusula NEW. Neste caso, está abrindo todos na mesma área permanecendo aberto apenas o último arquivo referenciado pelo comando USE. Feito isto, ao referenciar os demais arquivos, é gerado erro em tempo de execução.

Tente algo assim:
Código:
#include "set.ch"

FUNCTION Main()

   LOCAL cPath := "C:\mfolha\flparg.dbf"

   Set( _SET_DEFAULT, cPath )

   if Select( "FLPARG" ) == 0
      USE flparg SHARED NEW ALIAS flparg
 
endif

   //
   // ...
   //
   
   RETURN NIL
//-----------------------------------------------

Erro de tabela dbf

19 Dez 2016 10:50

Um exemplo simples Daiane e siga as instruções do Alexandre Santos (AlxSts) ele está correto:

Código:
static function OpenDataBases()

   field CODE,INVNUM,SERIAL

   if ! File( "invoices.dbf" )
      DbCreate( "invoices.dbf",;
                { { "INVNUM",    "C", 10, 0 }, ;
                  { "DATE",      "D",  8, 0 }, ;
                  { "CODE",      "C", 10, 0 }, ; // Client Code
                  { "CLIENT",    "C", 40, 0 }, ; // Client Name
                  { "ADDRESS",   "M", 10, 0 }, ; // Client Address
                  { "DETAILS",   "C", 30, 0 }, ; // Invoice Details
                  { "AMOUNT",    "N",  9, 0 }, ;
                  { "TAXRATE",   "N",  5, 2 }, ;
                  { "TAX",       "N",  9, 0 }, ;
                  { "TOTAL",     "N",  9, 0 }, ;
                  { "PAYDATE",   "D",  8, 0 } }, "DBFCDX", .T., "DB" )

      INDEX ON INVNUM TAG INVNUM
      CLOSE DB
   elseif !File( "invoices.cdx" )
      USE INVOICES EXCLUSIVE NEW ALIAS DB
      INDEX ON INVNUM TAG INVNUM
      CLOSE DB
   endif

   USE invoices SHARED
   SET ORDER TO TAG INVNUM
   GO BOTTOM
   nTaxRate    := INVOICES->TAXRATE
   GO TOP

   if ! File( "items.dbf" )
      DbCreate( "items.dbf",;
                { { "CODE",   "C", 10, 0 }, ;
                  { "NAME",   "C", 30, 0 }, ;
                  { "UNIT",   "C",  5, 0 }, ;
                  { "PRICE",  "N",  6, 2 } }, "DBFCDX", .T., "DB" )

      INDEX ON CODE TAG CODE
      CLOSE DB
   elseif !File( "items.cdx" )
      USE ITEMS NEW EXCLUSIVE ALIAS DB
      INDEX ON CODE TAG CODE
      CLOSE DB
   endif

   USE items NEW SHARED
   SET ORDER TO TAG CODE
   GO TOP

   if ! File( "invitems.dbf" )
      DbCreate( "invitems.dbf",;
                { { "INVNUM",    "C", 10, 0 }, ;
                  { "SERIAL",    "N",  3, 0 }, ;
                  { "ITEMCODE",  "C", 10, 0 }, ;
                  { "ITEMNAME",  "C", 30, 0 }, ;
                  { "QUANTITY",  "N",  8, 3 }, ;
                  { "UNIT",      "C",  5, 0 }, ;
                  { "PRICE",     "N",  6, 2 }, ;
                  { "DISCOUNT",  "N",  9, 0 } }, "DBFCDX", .T., "DB" )

      INDEX ON INVNUM + STR( SERIAL, 3, 0 ) TAG INVNUM
      INDEX ON DELETED() TAG DELETED
      CLOSE DB
   elseif !File( "invitems.cdx" )
      USE INVITEMS EXCLUSIVE NEW ALIAS DB
      INDEX ON INVNUM + STR( SERIAL, 3, 0 ) TAG INVNUM
      INDEX ON DELETED() TAG DELETED
      CLOSE DB
   endif

   USE invitems NEW SHARED
   aBlankItem  := Array( FCount() + 1 )
   AEval( aBlankItem, { |u,i| aBlankItem[ i ] := uValBlank( FieldGet( i ) ) }, 1, FCount() )
   aBlankItem[ FCount() + 1 ] := 0
   SET ORDER TO TAG INVNUM
   GO TOP

   USE invitems NEW SHARED ALIAS IIT
   SET ORDER TO TAG INVNUM
   GO TOP

   if ! File( "clients2.dbf" )
      DbCreate( "clients2.dbf",;
                { { "CODE",      "C", 10, 0 },;
                  { "FIRST",     "C", 20, 0 },;
                  { "LAST",      "C", 20, 0 },;
                  { "ADDRESS1",  "C", 30, 0 },;
                  { "ADDRESS2",  "C", 30, 0 },;
                  { "CITY",      "C", 20, 0 },;
                  { "ZIPCODE",   "C", 20, 0 },;
                  { "PHONE",     "C", 20, 0 },;
                  { "EMAIL",     "C", 20, 0 } }, "DBFCDX", .T., "DB" )

      INDEX ON CODE TAG CODE
      CLOSE DB
   elseif !File( "clients2.cdx" )
      USE CLIENTS2 EXCLUSIVE NEW ALIAS DB
      INDEX ON CODE TAG CODE
      CLOSE DB
   endif

   USE Clients2 NEW SHARED ALIAS "Clients"
   SET ORDER TO TAG CODE
   GO TOP

   SELECT invoices
   SET RELATION TO INVNUM INTO invitems SCOPED
   GO TOP

return nil




Erro de tabela dbf

02 Jan 2017 15:06

Amiguinhos,

daiane

Pelo que percebi neste código não vejo o uso de SELECT

Quando da abertura de muitas tabelas é praxe abrir todas as tabelas que serão usadas numa rotina.

Abrir uma tabela, pegar um dado e fecha-la em posteriormente e fazer isto recursivamente ou chamando a mesma função trocentas vezes consome mais processamento que o necessário e leva facilmente a quebrar durante o processo.

Abra todas as tabelas e use NEW para que uma nova área seja selecionada automaticamente para a tabela aberta e depois use SELECT para selecionar o seu uso.

Eu mesmo não gosto de estar em uma área e chamar campo de outra tabela como (FLFUNC->DEDIRRF * FLPARG->DEDUCAO) pois não tenho certeza que a outra tabela sendo chamada está aberta ou foi fechada por algum motivo que eu não programei.

Veja o command abaixo. Eu uso para abrir minhas tabelas sem precisar verificar se já está aberta. Uso no lugar do comando USE:
Código:
#command OPEN <(db)>                                                    ;
             [VIA <rdd>]                                                ;
             [ALIAS <a>]                                                ;
             [<new: NEW>]                                               ;
             [<ex: EXCLUSIVE>]                                          ;
             [<sh: SHARED>]                                             ;
             [<ro: READONLY>]                                           ;
             [INDEX <(index1)> [, <(indexn)>]]                          ;
       => if Select( <(db)> )==0                                        ;
         ;   dbNetUseArea( <.new.>, <rdd>, <(db)>, <(a)>, if(<.sh.> .or. <.ex.>, !<.ex.>, NIL), <.ro.>, 0 )[; dbSetIndex( <(db)> )];
         ; else                                                         ;
         ;   dbSelectArea( <(db)> )                                     ;
         ; end


Veja que para testar se a tabela está aberta em algum lugar é testado por Select( <(db)> )==0. Se estiver aberta é selecionado senão é aberto.
Postar uma resposta