Clipper On Line • Ver Tópico - Erro de tabela dbf
Página 1 de 1

Erro de tabela dbf

MensagemEnviado: 16 Dez 2016 10:26
por Daiane
error3.txt
(10.52 KiB) Baixado 95 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.

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

MensagemEnviado: 16 Dez 2016 12:15
por Kapiaba
Daiane, dúvida:

O programa esta em:

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


E os bancos em?

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


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

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


Vá informando. Tem boi na linha.

Erro de tabela dbf

MensagemEnviado: 16 Dez 2016 17:34
por Daiane
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

MensagemEnviado: 18 Dez 2016 21:53
por alxsts
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:
#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

MensagemEnviado: 19 Dez 2016 10:50
por Kapiaba
Um exemplo simples Daiane e siga as instruções do Alexandre Santos (AlxSts) ele está correto:

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

MensagemEnviado: 02 Jan 2017 15:06
por rochinha
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:
#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.