Page 1 of 2

QUE SIGNIFICA ESTE ERROR

Posted: Sat Feb 02, 2008 2:43 am
by Ramon Paredes
Hola Amigos del Foro,

Estoy tratando con un Programa de ALtas, Bajas y Cambios con Ado y Mysql, tengo un Browse con los respectivos botones de las acciones , las altas no hay problemas , las bajas no hay problemas, pero cuando se trata de editar o modificar un registro ahi esta el problema me lanza un mensaje de error :

DISP_E_MEMBERNOTFOUND:UPDATE(0)

No se que significa, revise mis estructuras de datos y todo bien, son 6 campos tipo char probe a cambiarlos a varchar pero da el mismo error lo raro es que solo cuando modifico.

Saludes y gracias de Antemano

Desde Managua, Nicaragua

Ramon Paredes

A nadie se le ha presentado este error S.O.S

Posted: Sun Feb 03, 2008 4:45 pm
by Ramon Paredes
Hola amigos del foro,

Sera que a nadie se le ha presentado este error ?

Agradezco cualquier orientacion al respecto

Saludes desde Managua, NIcaragua

Ramon Paredes

Posted: Sun Feb 03, 2008 5:10 pm
by Antonio Linares
Ramón,

Parece que le estás enviando el mensaje Update() a un objeto OLE, y que dicho mensaje no está definido en el objeto.

Posted: Mon Feb 04, 2008 7:51 pm
by sjingo
Hola Ramón

Podrías colocar el código con el que haces las modificaciones?. Usas ADO puro o ADORDD


Un saludo

Marcelo

Gracias por Responder Antonio y Sjingo

Posted: Tue Feb 05, 2008 10:20 pm
by Ramon Paredes
Sjingo :

Te muestro el codigo , como comente las altas, bien todo, las bajas, bien todo pero las modificaciones o ediciones ahi salta el error que mencione en mi primer post,

hasta puse un msgalert para que me mostrara en ese momento _ los valores y la longitudes y todo esta ok

agardezco cualquier sugerencia al respecto como ven es ado puro no uso adordd


//=====================
FUNCTION PRUEBA()
//=====================

Local oDlg,oBrw,SiNuevo := .f.
LOCAL oConexionAdo := TOLEAUTO():New("adodb.connection")
PRIVATE oRecordset := TOLEAUTO():New("adodb.recordset")

oConexionAdo:Open("DRIVER={MySQL ODBC 3.51 Driver}; SERVER=127.0.0.1 ; DATABASE=Personal1; UID=root; PWD=1234")
oRecordSet:LockType := adLockOptimistic
oRecordSet:CursorType := adOpenKeyset
oRecordSet:CursorLocation := adUseClient
oRecordSet:ActiveConnection(oConexionAdo)
oRecordSet:Source := "Select * from maestro"
oRecordSet:Open()
aCifra = oRecordset:Recordcount()

DEFINE DIALOG oDlg RESOURCE 78

REDEFINE LISTBOX oBrw FIELDS oRecordSet:Fields("Numero"):value,;
oRecordSet:Fields("Nombres"):value,;
oRecordSet:Fields("Apellido1"):value,;
oRecordSet:Fields("Apellido2"):value,;
oRecordSet:Fields("Tipo"):value,;
oRecordSet:Fields("Tip_Emp"):value;
HEADERS "Numero","Nombres","Apellido1","Apellido2","Tipo","Tip_Emp" ;
FIELDSIZES 80,150,120,120,60,100 ;
COLOR CLR_RED,CLR_WHITE ;
ID 108 OF oDlg

oBrw:aJustify ={.F.,.F.,.f.,.f.,.f.,.f.}
oBrw:bLogicLen = { || oRecordSet:RecordCount }
oBrw:bGoTop = { || oRecordSet:MoveFirst() }
oBrw:bGoBottom = { || oRecordSet:MoveLast() }
oBrw:bSkip = { | nSkip | Skipper( oRecordSet, nSkip ) }
oBrw:cAlias = "ARRAY"

REDEFINE BUTTON ID 102 of oDlg ACTION( AGREGO( .t., oBrw ) )
REDEFINE BUTTON ID 103 of oDlg ACTION( AGREGO( .f., oBrw ) )
REDEFINE BUTTON ID 104 of oDlg ACTION( BORRO( oBrw ) )
REDEFINE BUTTON ID 106 of oDlg ACTION( BUSCO() )
REDEFINE BUTTON ID 105 of oDlg ACTION( oDlg:End() )


ACTIVATE DIALOG oDlg CENTERED

oRecordSet:Close()
oConexionAdo:Close()

RETURN (.T.)

// oWndBrw:SetControl(oBrw)

STATIC FUNCTION SKIPPER( oRs, nSkip )

LOCAL nRec := oRs:AbsolutePosition

oRs:Move( nSkip )

IF oRs:EOF; oRs:MoveLast(); ENDIF
IF oRs:BOF; oRs:MoveFirst(); ENDIF

RETURN oRs:AbsolutePosition - nRec

Static Function RecordSetSkip(nSkip)
LOCAL nRec := oRecordSet:AbsolutePosition
oRecordSet:Move( nSkip )
IF oRecordSet:EOF; oRecordSet:MoveLast(); ENDIF
IF oRecordSet:BOF; oRecordSet:MoveFirst(); ENDIF
Return (oRecordSet:AbsolutePosition - nRec)


//========================================
STATIC FUNCTION AGREGO( Sinuevo, oBrw )
//========================================

Public oDlg2,mNumero,mNomb,mAp1,mAp2,mTipo,mDtipo,oNumero,oNomb,oAp1,oAp2,oTipo,oDtipo

if sinuevo = .t.

mNumero = space(5)
mNomb = space(25)
mAp1 = space(15)
mAp2 = space(12)
mTipo = space(1)
mDtipo = space(10)
else
mNumero = oRecordSet:Fields("Numero"):value
mNomb = oRecordSet:Fields("Nombres"):value
mAp1 = oRecordSet:Fields("Apellido1"):value
mAp2 = oRecordSet:Fields("Apellido2"):value
mTipo = oRecordSet:Fields("Tipo"):value
mDtipo = oRecordSet:Fields("Tip_Emp"):value
endif

DEFINE DIALOG oDlg2 RESOURCE 19

REDEFINE GET oNumero Var mNumero ID 101 of oDlg2
REDEFINE GET oNomb Var mNOmb ID 102 of oDlg2
REDEFINE GET oAp1 Var mAp1 ID 103 of oDlg2
REDEFINE GET oAp2 Var mAp2 ID 104 of oDlg2
REDEFINE GET oTipo Var mTipo ID 105 of oDlg2
REDEFINE GET oDtipo Var mDtipo ID 106 of oDlg2

REDEFINE BUTTON ID 107 of oDlg2 ACTION( GRABO1( SiNuevo, oBrw ),oDlg2:End() )
REDEFINE BUTTON ID 108 of oDlg2 ACTION( oDlg2:End(), oDlg2:End() )

ACTIVATE DIALOG oDlg2 CENTERED

RETURN

//=======================================
STATIC FUNCTION GRABO1( Sinuevo,oBrw)
//=======================================

IF SiNuevo = .t.

msgalert("aqui grabo")
oRecordSet:Addnew()
oRecordSet:Fields("Numero"):value := mNumero
oRecordSet:Fields("Nombres"):value := mNomb
oRecordSet:Fields("Apellido1"):value := mAp1
oRecordSet:Fields("Apellido2"):value := mAp2
oRecordSet:Fields("Tipo"):value := mTipo
oRecordSet:Fields("Tip_Emp"):value := mDtipo
oRecordSet:Update()

else

msgalert("aqui edito")
oRecordSet:Fields("Numero"):value := mNumero
oRecordSet:Fields("Nombres"):value := mNomb
oRecordSet:Fields("Apellido1"):value := mAp1
oRecordSet:Fields("Apellido2"):value := mAp2
oRecordSet:Fields("Tipo"):value := mTipo
oRecordSet:Fields("Tip_Emp"):value := mDtipo
MSGALERT("Campos a Mostrar : "+mNumero+str(len(mNumero))+" "+mNomb+str(len(mNomb))+" "+mAp1+str(len(mAP1))+" "+mAp2+str(len(mAp2))+" "+mTipo+str(len(mTipo))+" "+mDtipo+str(len(mDtipo)))
oRecordSet:Update()
endif

//oRecordSet:Update()
oRecordSet:Requery()

oBrw:Refresh()

MsgAlert("El RecordSet ha sido actualizado")

RETURN

//================================
STATIC FUNCTION BORRO( oBrw )
//================================

oRecordSet:Delete()
oRecordSet:Requery()

oBrw:Refresh()

RETURN

Posted: Wed Feb 06, 2008 5:08 am
by sjingo
Hola Ramón

Aparentemente todo está muy bien, y así también lo hago yo, usando el recordset con las mismas características, y si funciona.

Es como si en ese momento se destruyera la variable del objeto recordset. Prueba quitando el msgalert() que está antes del Update().

A lo mejor alguien con más experiencia pueda encontrar el problema. Aunque otra posibilidad es usar el método execute() del objeto Conection.

Que :( no poder ayudar, espero que encuentres pronto la solucion.

Un Saludo


Marcelo Jingo

Posted: Wed Feb 06, 2008 6:01 am
by sysctrl2
Ramon,

las variables, de tipo caracter checale que tengan la misma longitud

en la tabla.

por ejemplo APELLIDO1 VARCHAR(15)

mAp1 = space(15)

verifica que al momento de guardar no haya valores nulos

saludos...

Posted: Wed Feb 06, 2008 6:01 am
by sysctrl2
Ramon,

las variables, de tipo caracter checale que tengan la misma longitud

en la tabla.

por ejemplo APELLIDO1 VARCHAR(15)

mAp1 = space(15)

verifica que al momento de guardar no haya valores nulos

saludos...

Posted: Wed Feb 06, 2008 6:10 am
by sysctrl2
prueba tambien asi al guardar ,, sobre todo cuando es edicion,,

oRecordSet:Fields("Apellido1"):value := _scFill( mAp1, 15 )
oRecordSet:update()


function _scFill(c, nLon)
local nLen
local nSp
if valtype(c) <> "C"
c := ''
ENDIF
nLen := len(c)
nSp := len(space(nLon-nLen))
return ( c+space(nSp) )

saludos cordiales.

Posted: Wed Feb 06, 2008 6:16 am
by Manuel Valdenebro
En mi opinión, el objeto RecordSet es una matriz (array) y por tanto su manejo es muy parecido a la clase Database de FWH. Es una redundancia crear variables desde el RecordSet. He suprimido las funciones RecordSetSkip y Agrego1.- Uso oRs = oRecordSet.
Este sería el código:

REDEFINE BUTTON ID 102 of oDlg ACTION( AGREGO( .t., oBrw, oRs ) )
REDEFINE BUTTON ID 103 of oDlg ACTION( AGREGO( .f., oBrw, oRs ) )


//========================================
STATIC FUNCTION AGREGO( lAlta, oBrw, oRs )
//========================================
Local oDlg, lSalvar := .f.

IF lAlta = .t.
oRs:ADDNEW() // crea un nuevo registro en blanco
oRs:Fields("Numero"):value := SPACE(5)
oRs:Fields("Nombre"):value := SPACE(25)
oRs:Fields("Apellido1"):value := SPACE(15)
oRs:Fields("Apellido2"):value := SPACE(12)
oRs:Fields("Tipo"):value := SPACE(1)
oRs:Fields("Tip_Emp"):value := SPACE(10)
ENDI

DEFINE DIALOG oDlg RESOURCE 19

REDEFINE GET oRs:Fields("Numero"):value ID 101 of oDlg
REDEFINE GET oRs:Fields("Nombre"):value ID 102 of oDlg
REDEFINE GET oRs:Fields("Apellido1"):value ID 103 of oDlg
REDEFINE GET oRs:Fields("Apellido2"):value ID 104 of oDlg
REDEFINE GET oRs:Fields("Tipo"):value ID 105 of oDlg
REDEFINE GET oRs:Fields("Tip_Emp"):value ID 106 of oDlg

REDEFINE BUTTON ID 107 of oDlg ;
ACTION ( lSalvar := .T. , oDlg:End() )
REDEFINE BUTTON ID 108 of oDlg ;
ACTION oDlg:End()

ACTIVATE DIALOG oDlg CENTERED

IF lSalvar
oRs:UPDATE()
IF !empty(oRs:Filter)
oRs:REQUERY()
ENDI
ELSE
IF lAlta
oRs:DELETE()
oRs:REQUERY()
ENDI
ENDIF

oBrw:Refresh()
RETURN( NIL )

En las modificaciones no debe darte error. Si te da error en las altas, entonces es que la definición que estamos haciendo de _, no es la correcta.

graciaspor sus aportes

Posted: Wed Feb 06, 2008 3:03 pm
by Ramon Paredes
Amigos del foro,

Agradezco sus sugerencias, aplicare a ver que sucede, apenas pruebe les aviso como me fue,

Desde Managua , Nicaragua

Ramon Paredes

solucionado

Posted: Wed Feb 06, 2008 4:46 pm
by Ramon Paredes
Amigos del foro, sjingo, sysctrl2,Manuel,

Gracias por Responder ya probe las opciones y me funciono al 100% con al solucion planteada por manuel y algo de la funcion de sysctrl2,

Agradezco los aportes de este muy productivo foro y de los amigos en disposicion de ayuda desinteresada,

Saludes desde Managua, Nicaragua

Ramon Paredes

Posted: Wed Feb 20, 2008 12:27 pm
by Carlos Mora
Hola Cesar,
si mi memoria clippera no falla, la función _scFill ya existe en Clipper/Harbour y se llama PadR ;)

PadR tiene un comportamiento interesante, y es que no solo añade espacios hasta la longitud dada, sino tambien trunca la longitud si la string original la supera.

Un saludo,

Carlos.
sysctrl2 wrote: function _scFill(c, nLon)
......
return ( c+space(nSp) )

saludos cordiales.

Posted: Wed Feb 20, 2008 4:56 pm
by sysctrl2
Quetal Carlos,,

gracias por el tips.

saludos.

Re: QUE SIGNIFICA ESTE ERROR

Posted: Wed Nov 24, 2010 12:43 pm
by goosfancito
Dejen meterme en esta parte del codigo, quiero dar mi opinion personal y que me corrijan si esta mal.

Code: Select all

oRs:Fields("Numero"):value := SPACE(5)
 
Eso es muy facil al momento de codificar, me refiero a poner entre "" el nombre del campo, pero me ha pasado que si en un select tengo 2 o mas tablas y que el nombre de uno o varios de _ sean iguales entre las tablas...

A esto me refiero:

Supongamos esta estructura
TABLA1 -> ID char de 5
TABLA1 -> NOMBRE char de 15

TABLA2 -> ID char de 5
TABLA2 -> PRECIO char de 3
Cuando hacemos el select
SELECT * FROM TABLA1 A, TABLA2 B WHERE A.ID = B.ID
Y luego utilizamos:

Code: Select all

oRs:Fields("ID"):value := SPACE(5)
Tremendo quilombo se te puede armar si no conoces el funcionamiento del recordset, ya que ese ID que estamos poniendo entre comillas dobles el recordset lo tomo de la segunda tabla (tabla2->ID) y no del tabla1... por lo que a mi entender sería mejor acostumbrarse al principio (o siempre) a utilizarlo de esta forma (ojo, es comentario nada mas)

Code: Select all

oRs:Fields(0):value := SPACE(5)  // id tabla 1
oRs:Fields(1):value := SPACE(15)  // nombre tabla 1
oRs:Fields(2):value := SPACE(5)  // id tabla 2
oRs:Fields(3):value := SPACE(3)  // precio tabla 2
 


Concuerdan con esto o por no saber manejar bien el recordset no estoy teniendo en cuenta algo?

Gracias.