Page 1 of 2

error en tabla temporal mssql

PostPosted: Sat Mar 02, 2019 12:29 am
by artu01
Gente:
Creo una tabla temporal con ado en mssql, pero esa tabla no la veo en el Microsoft SQL Server Management, en donde esta en tempdb?

La tabla tiene un solo campo, le inserto un registro, quiero mostrar su contenido y me bota el msje:

Error description: (DOS Error -2147352567) WINOLE/1007 No se encontró el elemento en la colección que corresponde al nombre o el ordinal solicitado. (0x800A0CC1): ADODB.Recordset

Aquí esta mi fuente

Code: Select all  Expand view

    oCon:=AbreConexBd()

    cSQL := "CREATE TABLE #ppru"
    cSQL += "("
    cSQL += "numero CHAR(6) NOT NULL "
    cSQL += ")"

   Try
      oCon:Execute( cSQL )
   Catch
      MsgInfo( "Table Create ppru Failed" )
      oDlg:End()
      Return(.f.)
   End try

oRs := TOleAuto():New( "ADODB.Recordset" )
oRs:CursorType     := 1        // opendkeyset
oRs:CursorLocation := 3        // local cache
oRs:LockType       := 3        // lockoportunistic

cSQL := "SELECT * from [#ppru]"

TRY
  oRS:Open(cSQL,oCon )
CATCH oErr
  MsgInfo( "Error in Opening #ppru table" )
  oCon:Close()
  RETURN(.F.)
END TRY

 oRs:CLose()

  cSQL := " insert into [#ppru] (numero) "
  cSQL += "values('123456') "

oRs := TOleAuto():New( "ADODB.Recordset" )
oRs:CursorType     := 1        // opendkeyset
oRs:CursorLocation := 3        // local cache
oRs:LockType       := 3        // lockoportunistic

oRS:Open(cSQL,oCon )
msgalert(oRs:Fields("numero"):Value)  //>>>>>>> AQUI ME BOTA ERROR <<<<<<<<<<<<<<



Function AbreConexBD()
  LOCAL cCString, oError, oCon1

  xPROVIDER := "SQLOLEDB"                  // oledb provider
  xSOURCE   := "PYSASERVER"                // sql server name
  xCATALOG  := "PysaBD"                    // sql server database
  xUSERID   := "sa"
  xPASSWORD := "Pysa123456"
  xConnect  := 'Provider='+xPROVIDER+';Data Source='+xSOURCE+';Initial Catalog='+xCATALOG+';User Id='+xUSERID+';Password='+xPASSWORD

  TRY
    oCon1 := CreateObject( "ADODB.Connection" )
    oCon1:Open( xConnect )
  CATCH oError
     MsgStop( oError:Description )
  END
Return oCon1




 

Re: error en tabla temporal mssql

PostPosted: Tue Mar 05, 2019 12:51 am
by artu01
Gente
para los que trabajan con tablas sql y no con dbf, como hacen para guardar un detalle de una factura hasta que el usuario le de guardar
en donde lo almacenan, en arreglos? , yo quiero hacerlo con tablas temporales pero no me sale, lo crea, pero no lo veo en el visor de management de
sql esa tabla que he creado....tengo entendido que las tablas temporales mueren cuando cierro la conexion

Re: error en tabla temporal mssql

PostPosted: Tue Mar 05, 2019 11:11 am
by cmsoft
No se como funciona en MSSql, pero en MySql a las tablas temporales solo la ve la sesion que la generó. Y no la ves en la estructura de la base de datos, pero si haces un select o un insert sobre esa tabla, funciona como una tabla cualquiera.
Para ver si esta generada, puedes usar el comando SHOW CREATE TABLE mitabla, y te mostrara la estructura de la tabla temporal

Re: error en tabla temporal mssql

PostPosted: Tue Mar 05, 2019 11:41 am
by cnavarro
MSSQL:
Estas tablas son creadas en la base de datos tempdb, en la carpeta llamada Temporary Tables
Si cerramos la conexión actual, esta tabla se eliminará. Por ello, este tipo de tablas temporales es conocida como Tablas Temporales Locales.

Re: error en tabla temporal mssql

PostPosted: Tue Mar 05, 2019 4:16 pm
by Rick Lipkin
artu01

I do not create my temp tables in SqlServer or Ms Access .. just because ( especially in access ) the database grows in size even if you create a temp table and then delete it .. If I create reports or need a disposable Temp Table I use .dbf on the local client .. then delete it when I am done.

Rick Lipkin

Re: error en tabla temporal mssql

PostPosted: Wed Mar 06, 2019 12:45 am
by artu01
gracias carlos, cesar y rick
por sus comentarios no es recomendable usar tablas temporales, por otro lado no deseaba seguir usando dbf para crear tablas temporales, pero si no hay forma continuare con ellos


thanks carlos, cesar y rick
for the comments its not recommendable using temporal tables, by other side, i didnt want continue using dbf for making temporal tables, but if its not possible continuing with them

Re: error en tabla temporal mssql

PostPosted: Wed Mar 06, 2019 12:54 am
by Armando
artu01:

Disculpa pero, uso tablas temporales (MYSQL) frecuentemente y son altamente
confiables. Yo sí te las recomiendo.

Saludos

Re: error en tabla temporal mssql

PostPosted: Wed Mar 06, 2019 11:06 am
by cmsoft
Artu01:
Tal vez no me exprese bien. Yo no tengo conocimientos en MSSql. Pero en MySql, tal cual te dice Armando, yo uso muchisimo las tablas temporales, y son altamente confiables.
Code: Select all  Expand view
oApp:oServer:Execute("";
    + "CREATE TEMPORARY TABLE IF NOT EXISTS ppru ";
    +"( `numero` VARCHAR(6) NOT NULL ) ENGINE=INNODB DEFAULT CHARSET=utf8")

Re: error en tabla temporal mssql

PostPosted: Wed Mar 06, 2019 9:08 pm
by artu01
Armando wrote:artu01:

Disculpa pero, uso tablas temporales (MYSQL) frecuentemente y son altamente
confiables. Yo sí te las recomiendo.

Saludos

Gracias Armando y Cesar
Armando podrias enviarme un ejemplo donde utilices la tabla temporal

Re: error en tabla temporal mssql

PostPosted: Wed Mar 06, 2019 10:01 pm
by Armando
artu01:

Uso ADO puro ninguna librería de terceros, no es que sean malas, simplemente
no las necesito, aquí va un ejemplo

Code: Select all  Expand view

STATIC FUNCTION UpdWrk(oDlg,aGets,oBrx)
    IF lAddWrk
        oRsWrk:AddNew()
    ENDIF

    oRsWrk:Fields("WRK_CTD"):Value := oHdr:CTD
    oRsWrk:Fields("WRK_UDM"):Value := oHdr:UDM
    oRsWrk:Fields("WRK_POR"):Value := oHdr:POR
    oRsWrk:Fields("WRK_DES"):Value := oHdr:DES
    oRsWrk:Fields("WRK_PUN"):Value := oHdr:PUN

    IF oHdr:POR
        oRsWrk:Fields("WRK_IMP"):Value := ROUND(ROUND(oRsWrk:Fields("WRK_CTD"):Value / 100,5) * oRsWrk:Fields("WRK_PUN"):Value,2)
    ELSE
        oRsWrk:Fields("WRK_IMP"):Value := ROUND(oRsWrk:Fields("WRK_CTD"):Value * oRsWrk:Fields("WRK_PUN"):Value,2)
    ENDIF

    oRsWrk:UpDate()
    oRsWrk:Requery()
    oBrx:GoTop()
    oBrx:Refresh()
RETURN(.T.)



STATIC FUNCTION CreaTabla()
    // Definimos el nombre de la tabla usando la constante A1 y la hora de creación
    // con objeto de evitar duplicidad de nombre con otro usuario
    cTabNam := "A1" + SUBSTR(TIME(),1,2) + SUBSTR(TIME(),4,2) + SUBSTR(TIME(),7,2)

    // Definimos el comando para crear la tabla con una estructura a mis necesidades
    // Ojo la defino como TEMPORARY
    cCmdSql := "CREATE TEMPORARY TABLE IF NOT EXISTS " + cTabNam + " (" +;
                    "WRK_ROW INT                    AUTO_INCREMENT," +;
                    "WRK_CTD DECIMAL(09,3)      DEFAULT 0.000   COMMENT 'Cantidad solicitada'," +;
                    "WRK_UDM CHAR(03)               DEFAULT ''      COMMENT 'Unidad de medida'," +;
                    "WRK_POR BIT                    DEFAULT 0       COMMENT 'Es porcentaje ?'," +;
                    "WRK_DES TEXT                                       COMMENT 'Descripción'," +;
                    "WRK_PUN DECIMAL(13,2)      DEFAULT 0.0000  COMMENT 'Precio unitario'," +;
                    "WRK_IMP DECIMAL(13,2)      DEFAULT 0.00    COMMENT 'Importe'," +;
                    "PRIMARY KEY(WRK_ROW))" +;
                    "ENGINE = InnoDB                                    COMMENT 'Detalle de factura';"

    // Ejecutamos el comando para crear la tabla temporal
    TRY
        oApp:oCon:Execute(cCmdSql)
    CATCH oError
        MsgInfo("La tabla " + cTabNam + " NO pudo ser creada",oApp:cAplicacion)
        oApp:oCon:ShowError()
        RETURN(.F.)
    END

    // Creamos el recordset para abrir la tabla temporal
    TRY
        oRsWrk  :=  TOleAuto():New("adodb.recordset")
    CATCH oError
        MsgStop( "No se ha podido crear el RECORDSET de LA TABLA DE PASO !", oApp:cAplicacion)
        oRsWrk  :=  NIL
        oApp:oCon:ShowError()
        RETURN(.F.)
    END

    // Definimos las propiedades del recordset, entre otras el nobre de
    // la tabla que queremos abrir
    oRsWrk:CursorLocation   := adUseClient
    oRsWrk:LockType         := adLockOptimistic
    oRsWrk:CursorType           := adOpenDynamic
    oRsWrk:Source               := "SELECT " +;
                                            "* " +;
                                        "FROM " + cTabNam

    // Ejecutamos el comando para abrir la tabla
    TRY
        oRsWrk:Open(oRsWrk:Source,oApp:oCon)
    CATCH oError
        MsgStop( "No se ha podido abrir el RECORDSET de la TABLA DE PASO !", oApp:cAplicacion)
        oApp:oCon:ShowError()
        RETURN(.F.)
    END
RETURN(.T.)
 


Y tengo un xBrowse donde se muestra el contenido de la tabla temporal, si me dices
específicamente que necesitas lo podemos ver.

Saludos

Re: error en tabla temporal mssql

PostPosted: Wed Mar 06, 2019 11:45 pm
by artu01
Excelente Armando!

Gracias por tu código lo analizare y adecuare a mis necesidades, si necesito ayuda te la pedire

Re: error en tabla temporal mssql

PostPosted: Thu Mar 07, 2019 2:35 am
by Armando
artu01:

Este es mi correo por si necesitas algo

estbucarm @ Gmail . com

Saludos

Re: error en tabla temporal mssql

PostPosted: Sat Mar 09, 2019 12:26 am
by artu01
Code: Select all  Expand view

// Ejecutamos el comando para crear la tabla temporal
    TRY
        oApp:oCon:Execute(cCmdSql)
    CATCH oError
        MsgInfo("La tabla " + cTabNam + " NO pudo ser creada",oApp:cAplicacion)
        oApp:oCon:ShowError()
        RETURN(.F.)
    END
 

Armando podrias mostrarme la definición de oApp?
oCon entiendo que es el objeto conexion pero oApp que viene hacer?

Gracias

Re: error en tabla temporal mssql

PostPosted: Sat Mar 09, 2019 12:54 am
by Armando
artu01:

oApp es una clase donde defino varias DATAs entre otras oCon que efectivamente
contiene el objeto de la conexión.

Saludos

Re: error en tabla temporal mssql

PostPosted: Mon Mar 11, 2019 2:19 pm
by artu01
Ok Armando, no he probado este codigo pero quiere decir que si lo hago de esta forma debería funcionar?,
me parece que anteriormente quize hacerlo de esta manera y me salia error como que oCon no tenia ese metodo o algo por el estilo

Code: Select all  Expand view

    oCon:=AbreConexBd()
cTabNam:='Prueba'

cCmdSql := "CREATE TEMPORARY TABLE IF NOT EXISTS " + cTabNam + " (" +;
                    "WRK_ROW INT                    AUTO_INCREMENT," +;
                    "WRK_CTD DECIMAL(09,3)      DEFAULT 0.000   COMMENT 'Cantidad solicitada'," +;
                    "WRK_UDM CHAR(03)               DEFAULT ''      COMMENT 'Unidad de medida'," +;
                    "WRK_POR BIT                    DEFAULT 0       COMMENT 'Es porcentaje ?'," +;
                    "WRK_DES TEXT                                       COMMENT 'Descripción'," +;
                    "WRK_PUN DECIMAL(13,2)      DEFAULT 0.0000  COMMENT 'Precio unitario'," +;
                    "WRK_IMP DECIMAL(13,2)      DEFAULT 0.00    COMMENT 'Importe'," +;
                    "PRIMARY KEY(WRK_ROW))" +;
                    "ENGINE = InnoDB                                    COMMENT 'Detalle de factura';"

   Try
      oCon:Execute( cCmdSql )
   Catch
      MsgInfo( "Fallo en la creacion de la tabla" )
      oDlg:End()
      Return(.f.)
   End try


Function AbreConexBD()
  LOCAL cCString, oError, oCon1

  xPROVIDER := "SQLOLEDB"                  // oledb provider
  xSOURCE   := "PYSASERVER"                // sql server name
  xCATALOG  := "PysaBD"                    // sql server database
  xUSERID   := "sa"
  xPASSWORD := "Pysa123456"
  xConnect  := 'Provider='+xPROVIDER+';Data Source='+xSOURCE+';Initial Catalog='+xCATALOG+';User Id='+xUSERID+';Password='+xPASSWORD

  TRY
    oCon1 := CreateObject( "ADODB.Connection" )
    oCon1:Open( xConnect )
  CATCH oError
     MsgStop( oError:Description )
  END
Return oCon1