Erro de tabela dbf

Discussão sobre a biblioteca Fivewin - O Clipper para Windows.

Moderador: Moderadores

Avatar do usuário
Daiane
Usuário Nível 3
Usuário Nível 3
Mensagens: 122
Registrado em: 28 Out 2014 16:19
Localização: Feira de Santana - BA

Erro de tabela dbf

Mensagem por Daiane »

error3.txt
(10.52 KiB) Baixado 121 vezes
error2.txt
(16.63 KiB) Baixado 103 vezes
error1.txt
(16.45 KiB) Baixado 93 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: Selecionar todos

if !FLPARG->(used())
	     USE ("C:\mfolha\flparg.dbf") SHARED alias (flparg)
	endif	
	::VIRRF -= (FLFUNC->DEDIRRF * FLPARG->DEDUCAO)
o erro ocorre no: FLPARG->DEDUCAO
XHb 1.2.1 + FW 12.05 + Pelles C IDE
"Eu adoraria mudar o mundo, mas não me deram o código-fonte."
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Erro de tabela dbf

Mensagem por Kapiaba »

Daiane, dúvida:

O programa esta em:

Código: Selecionar todos

C:\mfolhawin\ImpVContraCheque.prg => IMPVCONTRACHEQUE:USEDB( 115 )
E os bancos em?

Código: Selecionar todos

USE ("C:\mfolha\flparg.dbf") SHARED alias (flparg)
não concordo com esta logica mas, se isso está certo... Eu faria assim:

Código: Selecionar todos

USE ("C:\mfolha\flparg.dbf") SHARED NEW alias flparg 
Vá informando. Tem boi na linha.
Avatar do usuário
Daiane
Usuário Nível 3
Usuário Nível 3
Mensagens: 122
Registrado em: 28 Out 2014 16:19
Localização: Feira de Santana - BA

Erro de tabela dbf

Mensagem por Daiane »

Pior q ta assim mesmo os fontes em um diretório e os dbf em outros
ja peguei o sistema funcionando assim
XHb 1.2.1 + FW 12.05 + Pelles C IDE
"Eu adoraria mudar o mundo, mas não me deram o código-fonte."
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Erro de tabela dbf

Mensagem 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:

Código: Selecionar todos

#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
//-----------------------------------------------
[]´s
Alexandre Santos (AlxSts)
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Erro de tabela dbf

Mensagem por Kapiaba »

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

Código: Selecionar todos

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
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Erro de tabela dbf

Mensagem 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:

Código: Selecionar todos

#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.
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.
Responder