FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour error en tdatabase con DBF
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
error en tdatabase con DBF
Posted: Mon Feb 20, 2023 10:10 PM
Gente estoy usando fw vers. 1712 y tengo problemas con la instruccion database con DBFs
Asi lo uso:
Code (fw): Select all Collapse
select factura
DATABASE oDbf
...
Con la vers. 13.01 usaba alias o database en forma alternante sin prpblema pero ahora que estoy trabajando
con la 1712 mi programa corre pero despues de leer la instruccion DATABASE oDbf aparecen estos errores tales como: ORDKEYNO(), Alias no existe, etc.

Mis tablas DBFs con su alias son abiertas al iniciar mi programa, segun he leido cuando cierro el objeto oDbf tambien cierra el Alias?

Ha variado la clase TDATABASE de la vers. 13 a la 17?, supongo que si, entonces podrian indicarme la forma correcta de usar el DATABASE odbf sin que cierre la tabla ya que el sistema esta en red.

Gracias
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
Posts: 607
Joined: Mon Mar 04, 2013 04:32 PM
Re: error en tdatabase con DBF
Posted: Fri Feb 24, 2023 08:21 AM

Hola amigo.

Yo también uso el objeto database alternativamente junto con alias, lo uso para búsquedas. Tengo las bases de datos abiertas y el objeto database lo uso con otro alias.

No tengo ningún problema

Podíamos ver un poco de tu código?

Saludos

Jose.

Enviado desde mi POCOPHONE F1 mediante Tapatalk

Fwh 24.07 64 bits + Harbour 64 bits 3.2dev(r2407221137) + MSVC64
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
Re: error en tdatabase con DBF
Posted: Thu Mar 02, 2023 06:32 AM
jose vicente gracias x responder, ahi te alcanzo mi codigo fuente.

MAIN.PRG es en donde abro las tablas dbf al inicio
Code (fw): Select all Collapse
...
...
    IF !(VALTYPE( AbreDbf("ARTICULO", .T., .F. , , cPathDbf+cSubCarp, {"articulo"  }, "Articulos" ) ) == "O" .AND.     ;
         VALTYPE( AbreDbf("PATRON", .T., .F. , , cPathDbf+cSubCarp, {"PATRON"  }, "Patrones" ) ) == "O" .AND.          ;
         VALTYPE( AbreDbf("PERSONA" , .T., .F., , cPathDbf, {"PERSONA"},"Personas") ) == "O" .AND.                     ;
         VALTYPE( AbreDbf("IGV"     , .T., .F., , cPathDBF, , "I.G.V." ) ) == "O" .AND.                                ;
         VALTYPE( AbreDbf("PORC"     , .T., .F., , cPathDBF, , "Porcentaje" ) ) == "O" .AND.                           ;
         VALTYPE( AbreDbf("UBICA"   , .T., .F., , cPathDBF, {"UBICA"  }, "Ubicaciones" ) ) == "O" .AND.                ;
         VALTYPE( AbreDbf("UBIGEO"  , .T., .F., , cPathDBF, {"UBIGEO"  }, "Ubicacion Geografica" ) ) == "O" .AND.      ;
         VALTYPE( AbreDbf("CODERROR", .T., .F., , cPathDBF, {"CODERROR"  }, "Codigo de Errores" ) ) == "O" .AND.       ;
         VALTYPE( AbreDbf(cDbfGuia , .T., .F., "CABGUIA", cPathDbf, {cDbfGuia}, "Cabecera") ) == "O" .and.             ;
         VALTYPE( AbreDbf(cDbfDGuia , .T., .F., "DETGUIAD", cPathDbf, {cDbfDGuia}, "Movimientos de guias" ) ) == "O" .AND. ;
         VALTYPE( AbreDbf(cDbfParte , .T., .F., "CABPARTE", cPathDbf, {cDbfParte}, "Cabecera de Parte") ) == "O" .and. ;
         VALTYPE( AbreDbf(cDbfdParte , .T., .F., "DETPARTE", cPathDbf, {cDbfdParte}, "Movimientos de partes" ) ) == "O" .AND. ;
         VALTYPE( AbreDbf("TIPNOTA"  , .T., .F. , , cPathDBF, {"TIPNOTA"}, "Tipos de Nota"  ) ) == "O" .AND.           ;
         VALTYPE( AbreDbf(cDbfNc, .T., .F., "CABNC", cPathDbf, {cDbfNc}, "Cabecera de NC") ) == "O" .and.              ;
         VALTYPE( AbreDbf(cDbfDNc, .T., .F., "DETNC", cPathDbf,{cDbfDNc}, "Detalle de NC") ) == "O" .and.              ;
         VALTYPE( AbreDbf(cDbfFac   , .T., .F., "FACTURA", cPathDbf, {cDbfFac}, "Facturas"   ) ) == "O"  .AND.         ;
         VALTYPE( AbreDbf(cDbfDFac   , .T., .F., "DETFAC", cPathDbf, {cDbfDFac} ,"Detalle de Facturas"   ) ) == "O"  .AND.      ;
         VALTYPE( AbreDbf(cDbfAnu   , .T., .F., "ANULADA", cPathDbf,  {cDbfAnu}  ,"Comprob. Anulados"   ) ) == "O"  .AND.         ;
         VALTYPE( AbreDbf("CONPAG" , .T., .F., , cPathDBF, {"CONPAG"}, "Condiciones de Pago" ) ) == "O" .AND.          ;
         VALTYPE( AbreDbf("MCODI"   , .T., .F., , cPathDbf+cSubCodi, {"MCODI"}, "Proveedores"         ) ) == "O" .AND. ;
         VALTYPE( AbreDbf("EMPRESA"  , .T., .F. , , cPathDBF, {"empresa"}, "Empresas"  ) ) == "O"  ;
        )
        lOk:=.f.
        Msgalert("El archivo esta siendo usado")
      IIF( Select("PERSONA" ) <> 0, PERSONA->( DBCLOSEAREA() ), )
      IIF( Select("IGV" ) <> 0, IGV->( DBCLOSEAREA() ), )
      IIF( Select("PORC" ) <> 0, PORC->( DBCLOSEAREA() ), )
      IIF( Select(cDbfGuia) <> 0, (cDbfGuia)->( DBCLOSEAREA() ), )
      IIF( Select(cDbfDGuia) <> 0, (cDbfDGuia)->( DBCLOSEAREA() ), )
          IIF( Select(cDbfParte) <> 0, (cDbfParte)->( DBCLOSEAREA() ), )
          IIF( Select(cDbfdParte) <> 0, (cDbfdParte)->( DBCLOSEAREA() ), )
      IIF( Select("MCODI") <> 0, MCODI->( DBCLOSEAREA() ), )
      IIF( Select("ARTICULO") <> 0, ARTICULO->( DBCLOSEAREA() ), )
      IIF( Select("CONPAG") <> 0, CONPAG->( DBCLOSEAREA() ), )
      IIF( Select("EMPRESA"  ) <> 0, EMPRESA->( DBCLOSEAREA()  ), )
      IIF( Select("PATRON"  ) <> 0, PATRON->( DBCLOSEAREA()  ), )
      IIF( Select("Factura") <> 0, Factura->( DBCLOSEAREA() ), )
      IIF( Select("detfac") <> 0, detfac->( DBCLOSEAREA() ), )
      IIF( Select("ANULADA") <> 0, ANULADA->( DBCLOSEAREA() ), )
      IIF( Select("Ubica") <> 0, Ubica->( DBCLOSEAREA() ), )
      IIF( Select("Ubigeo") <> 0, Ubigeo->( DBCLOSEAREA() ), )
      IIF( Select("CodError") <> 0, CodError->( DBCLOSEAREA() ), )
      IIF( Select("CABNC") <> 0, CABNC->( DBCLOSEAREA() ), )
      IIF( Select("DETNC") <> 0, DETNC>( DBCLOSEAREA() ), )
      IIF( Select("TIPNOTA") <> 0, TIPNOTA->( DBCLOSEAREA() ), )
    ENDIF
LIBSIS.PRG, prg contiene las funciones del sistema
Code (fw): Select all Collapse
FUNCTION AbreDBF( cFile, lRed, lSoloLee, cAlias, cPath, aNtx, cName )
   LOCAL oDBF, i
   MEMVAR cPathDBF
   MEMVAR Exten

   //Chk defaults
   DEFAULT lRed := .T.
   DEFAULT lSoloLee := .F.
   DEFAULT cAlias := cFile
   DEFAULT cPath  := cPathDBF
   DEFAULT cName  := cFile
   DEFAULT aNtx   := NIL

   //Chk existencia de Archivos
   IF !FILE( cPath+cFile+".DBF" )
      MsgBox(2,"No existe el Archivo:"+cName+".DBF")
      Return ( 1 )
   ENDIF

   //Abre Archivo
   DBUSEAREA( .T.,"DBFCDX",cPath+cFile+".DBF", cAlias, lRED, lSoloLee )

   //Si no hay error retorna objeto
   IF !NETERR()
      //Abre Indices Pasados en aNtx
      If aNtx != NIL
         FOR i:=1 TO LEN(aNtx)
            IF FILE( cPath+aNtx[i]+Exten )
               (cAlias)->( DBSETINDEX( cPath+aNtx[i]+Exten ) )
            ELSE
               MsgBox(2,"No existe Indice : "+aNtx[i]+Exten)
               RETURN ( -2 )
            ENDIF
         NEXT
      Endif
      DATABASE oDBF
      oDBF:bEof := {|| NIL }                               
      oDBF:bBof := {|| NIL }
   ELSE
      //si hay error retorna un numero 0
      MsgBox(2, "No se puede abrir el archivo "+cName+" - Esta siendo usado." )
      oDBF := 0
   ENDIF
   RETURN ( oDBF )
BRWFACTU.PRG, modulo para visualizo las facturas con xbrowse
Code (fw): Select all Collapse
FUNCTION BrwFactu()
   LOCAL oBtn
   LOCAL nKey
   LOCAL aDatos := {}, nVer, nHor
   cMes    :=StrZero(mMes,2)

    select FACTURA
    set relation to factura->ruc into mcodi
    
    SELECT FACTURA
    DATABASE oDbf        //<==== AQUI BOTA ERROR de msje ORDKEYNO() o Alias no existe
                                  //la primera vez que entro no bota error, salgo del modulo y vuelvo a entrar se cae el prog. lanzando el msje ORDKEYNO u otro msje como ALIAS NO EXISTE
                                 //Con fwh13.07 no tuve problema pero con la vers. fwh1712 sale error

    INDEX ON facbol+numero TAG d:\cabfac to d:\cabfac temporary for factura->CodUsu+factura->mes=MEMVAR->CodUsu+StrZero(mMes,2) .and. factura->estenv <> ' ' .and. year(factura->fecha) = mAnio descending //ADDITIVE

    factura->(dbgotop())

    DEFINE DIALOG  oDlg RESOURCE "BRW_FACTURA" TITLE "Facturas/Boletas/NCs" FONT oFontS

    REDEFINE SAY oSay PROMPT cString ID 111 OF oDlg                     //1

    REDEFINE XBROWSE oBrw                                    ;
     COLUMNS "FACBOL","dtoc(FECHA)","NUMERO","RAZSOC","IIF(MONEDA=='S', 'S/.', 'US$')",;
             "MONTO","DSCTOV","NETO","IGV","TOTAL", "iif(factura->estanu='A', FACTURA->FBaja, '')"  ;
            ALIAS "FACTURA"                                  ;
      FIELDSIZES 28,66,74,200,30,85,60,60,60,85,66           ;
      HEADERS                               ;
             "F/B/C"                        ;
            ,"FECHA"                        ;
            ,"NUMERO"                       ;
            ,"CLIENTE"                      ;
            ,"MON."                         ;
            ,"T.BRUTO"                      ;
            ,"T.DSCTO"                      ;
            ,"SUBTOT"                       ;
            ,"IGV"                          ;
            ,"TOTAL"                        ;
            ,"F.BAJA"                       ;
      PICTURES nil,"99/99/9999","@R 999-9999999",nil, nil, "99,999,999.99", "@999,999.99","999,999.99","999,999.99","99,999,999.99",nil ;
      ID 4001 OF oDlg                       ;                      //2
      LINES CELL NOBORDER                   ;
      UPDATE

      oBrw:aJustify   := {.F.,.F.,.F.,.F.,.F.,.T.,.T.,.T.,.T.,.T.,.F.}
      oBrw:nMarqueeStyle       := MARQSTYLE_HIGHLROW
            oBrw:l2007            := .f.
      oBrw:bClrHeader := {|| { CLR_HBLUE,RGB(232, 255, 232) } }
        oBrw:nStretchCol := STRETCHCOL_WIDEST

      oBrw:LVscroll   := .T.
      oBrw:LHscroll   := .T.

      oBrw:bClrStd = {|| IF( FACTURA->EstAnu="A", { CLR_BLACK, RGB(200, 43, 62) } , { CLR_BLACK, RGB(232, 255, 232) } ) } // STANDAR
      oBrw:bClrSelFocus = {|| { CLR_WHITE, GetSysColor(13 ) } } // CUANDO TIENE EL FOCUS
      oBrw:bClrSel = {|| IF( FACTURA->EstAnu="A", { CLR_BLACK, RGB(200, 35, 18) } , { CLR_BLACK, RGB(232, 255, 232) } ) } // REGISTRO SELECCIONADO

     REDEFINE BUTTON oBtn ID 210 OF oDlg ;                      //3                                                                                                                            
         ACTION ( iif(FACTURA->FacBol='F', rFactura1T(FACBOL+NUMERO) , ;
         iif(FACTURA->FacBol='B',rBoleta1T(FACBOL+NUMERO),rCredito1T(FACBOL+NUMERO))), pone_cursor() )
         oBtn:cTooltip := "Impresion de Comprobante"

     REDEFINE BUTTON oBtn ID 18 OF oDlg ;                      //4
         ACTION ( rGuia1(FACBOL+NUMERO), pone_cursor() )
         oBtn:cTooltip := "Impresion de Guia de Remision"

     REDEFINE BUTTON oBtn ID ID_CANCEL OF oDlg ;                      //5
         ACTION ( oDlg:End() ) CANCEL
         oBtn:cTooltip := "Sale de la ventana"

     REDEFINE BUTTON oBtn ID 4002 OF oDlg ;                      //6
         ACTION IIF(FACTURA->EstAnu<>'A', (IIF(FACTURA->FACBOL="B",iif(iif(empty(cUserTda),Pide_ClaveR(),.T.), AnularBol(),) ,AnuCpe()), Pone_Cursor()), )
         oBtn:cTooltip := "Anulacion de Comprobante"

     REDEFINE BUTTON oBtn ID 4003 OF oDlg ;                      //7
         ACTION ( Validar_CPE(), Pone_Cursor(oBrw) )
         oBtn:cTooltip := "Validar Anulacion"

     ACTIVATE DIALOG oDlg NOWAIT ON INIT (oDlg:MOVE(100,100), oBrw:SetFocus())
return nil
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
Posts: 4840
Joined: Fri Nov 18, 2005 04:52 PM
Re: error en tdatabase con DBF
Posted: Thu Mar 02, 2023 04:35 PM
Parece que ambos están usando objetos de la base de datos como si no fueran objetos. Estás haciendo mucho trabajo.

Cuando crea un objeto de base de datos, se abre automáticamente en una nueva área. Entonces puedes hacer:

oCliente1:= TDatabase:Nuevo( ,"cliente")
oCliente2:= TDatabase:Nuevo( ,"cliente")

Para probar lo anterior haz:

? oCliente1:nÁrea
? oCliente2:nÁrea

Habrá dos copias de la base de datos abiertas y cada una en su propia área de trabajo. Pueden estar en la misma función o en funciones diferentes y ambos pueden estar abiertos al mismo tiempo.

> entonces podría decirme la forma correcta de usar la BASE DE DATOS odbf sin cerrar la tabla ya que el sistema está en red.

No desea estar limitado a abrir solo una copia de una base de datos a la vez en cualquier aplicación. Las computadoras ahora tienen suficiente memoria para manejar la apertura de la misma base de datos varias veces en la misma aplicación. Además, esto le evita tener que guardar y restaurar los atributos de una base de datos (regno actual, índice, filtro, etc.) siempre que la use.

Ver también: http://gointellitech.com/program.html
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
Re: error en tdatabase con DBF
Posted: Sun Mar 05, 2023 03:23 PM

thank you Mr. Bott!

i will change my code.

Excellent your explain about POO.

fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql

Continue the discussion