Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Permitir longitud cero con Acces

162 views
Skip to first unread message

Eko

unread,
Sep 30, 2008, 7:22:04 PM9/30/08
to
Estimados amigos. Estoy finalizando un proyecto con VB6 y Access que me ha
venido funcionando correctamente en la creación de las bases de datos y sus
Tablas, pero tengo el siguiente problema.
Si la base de datos ya está creada y a una tabla le añado una columna que
necesito admita "longitud cero" con el siguiente código

cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data
Source = " & EntornoDatos1 & ";" 'Abrímos el catálogo
Set tbl = cat.Tables("Plan")
With Col 'Especificamos las propiedades
del campo
Set .ParentCatalog = cat
.Name = "Prov"
.Type = adVarWChar
.DefinedSize = 2
.Attributes = adColNullable
.Properties("Jet OLEdB:Allow Zero Length") = True
End With
tbl.Columns.Append Col 'Añadimos la
columna a la tabla
.......

al hacer el Append Col de la última sentencia expuesta me produce el rror
--2147217887 "La operación de múltiples pasos de OLE DB generó
errores. Compruebe los valores de estado de OLE DB si es posible. No se
realizó ningún trabajo". (No se como comprobar los valores de estado...)

Si quito la instrucción .Properties("Jet.......) todo corre perfectamente
pero me añade la columna sin admitir campo de longitud cero.

Cosa similar ocurre al crear una BD nueva con el siguiente código (que
limito a lo que aqui interesa)

Public Sub CrearTablaPlan(bErr As Boolean, Handle As Long)
'
Set cat = New ADOX.Catalog
Set tbl = New ADOX.Table
'
' Abrir el catálogo
cat.ActiveConnection = strConn
'
' Crear la nueva tabla
With tbl
.Name = "Plan"
Set .ParentCatalog = cat
' Crear los campos y añadirlos a la
tabla.
.Columns.Append "Prov", adVarWChar, 2
..................
......................

.Columns("Prov").Attributes = adColNullable
.Columns("Prov").Properties("Jet OLEDB.4.0:Allow Zero Length").value
= True

End With
'
' Añadir la nueva tabla a la base de
datos
cat.Tables.Append tbl
'
Set tbl = Nothing
Set cat = Nothing
Exit Sub

En este caso en la línea Columns("Prov").Properties("Jet OLEDB.4.0:Allow
Zero Length").value = True, me salta el error 3265 "No se encontró el
elemento en la colección que corresponde con el nombre o el ordinal pedido".

¿Alguien me puede revisar el código y decirme que es lo que estoy haciendio
mal? Lo agradecería enormemente porque es lo único que me falta para
finalizar el proyecto y en tanto no lo resuelva, no me sirve de nada. ¿Puede
faltame alguna Referencia? porque el error del segundo caso parece que puede
venir por ahí ya que escribir el código despues de Properties lo que me pide
es un índice. He probado con el índice 13 que es el equivalente, pero da el
mismo error.He revisado Google durante mas de un mes para buscar una solución
y parece que todo lo tengo bien, pero no es asi.

Muy agradecido de antemano y perdón por la extensión pero he querido dar las
máximas pistas posible.
Un saludo a tod@as

Victor Koch arroba punto punto punto

unread,
Oct 1, 2008, 10:16:49 AM10/1/08
to
Hola,

Cuando creas un campo usando ADOX por defecto en permitir longitud cero esta
en true. Asi que tu codigo deberia ser asi:

Dim cat As ADOX.Catalog


Set cat = New ADOX.Catalog

Dim tbl As ADOX.Table


Set tbl = New ADOX.Table

Dim col As ADOX.Column
Set col = New ADOX.Column

Set cat.ActiveConnection = Cnn ' < Conexion previamente abierta


Set tbl = cat.Tables("Plan")

With col


Set .ParentCatalog = cat
.Name = "Prov"
.Type = adVarWChar
.DefinedSize = 2
.Attributes = adColNullable

End With
tbl.Columns.Append col
tbl.Columns.Refresh

Set cat = Nothing


--
Un Saludo, Víctor Koch

"Eko" <E...@discussions.microsoft.com> escribió en el mensaje
news:C11DCD47-B5FC-4F6B...@microsoft.com...

Eko

unread,
Oct 1, 2008, 12:32:14 PM10/1/08
to
Hola Victor,

En primer lugar, muchas gracias por contestar.
He probado el código que me envías y me crea la columna como "No permitir
longitud cero". Uso Access 2000 y en algún sitio ya había leido que por
defecto la creaba al contrario, pero por lo visto no es asi.

Me está volviendo loco el asunto, ya que tengo paralizado el proyecto por
culpa de esa tontería que no encuentro modo de resolverla. ¿Alguna otra
sugerencia, por favor?

Un saludo y muchas gracias

Victor Koch arroba punto punto punto

unread,
Oct 1, 2008, 1:49:15 PM10/1/08
to
Hola Eko,

A ver proba con esto

>> With col
>> Set .ParentCatalog = cat
>> .Name = "Prov"
>> .Type = adVarWChar
>> .DefinedSize = 2
>> .Attributes = adColNullable
>> End With
>> tbl.Columns.Append col
>> tbl.Columns.Refresh

cat.Tables("Plan").Columns("Prov").Properties("Jet OLEDB:Allow Zero
Length").Value = True
cat.Tables("Plan").Columns("Prov").Properties.Refresh


>>
>> Set cat = Nothing


--
Un Saludo, V�ctor Koch

"Eko" <E...@discussions.microsoft.com> escribi� en el mensaje
news:2904FA59-9CBC-437D...@microsoft.com...


> Hola Victor,
>
> En primer lugar, muchas gracias por contestar.

> He probado el c�digo que me env�as y me crea la columna como "No permitir
> longitud cero". Uso Access 2000 y en alg�n sitio ya hab�a leido que por


> defecto la creaba al contrario, pero por lo visto no es asi.
>

> Me est� volviendo loco el asunto, ya que tengo paralizado el proyecto por
> culpa de esa tonter�a que no encuentro modo de resolverla. �Alguna otra

>> Un Saludo, V�ctor Koch
>>
>>
>>
>> "Eko" <E...@discussions.microsoft.com> escribi� en el mensaje


>> news:C11DCD47-B5FC-4F6B...@microsoft.com...
>> > Estimados amigos. Estoy finalizando un proyecto con VB6 y Access que me
>> > ha

>> > venido funcionando correctamente en la creaci�n de las bases de datos y


>> > sus
>> > Tablas, pero tengo el siguiente problema.

>> > Si la base de datos ya est� creada y a una tabla le a�ado una columna
>> > que
>> > necesito admita "longitud cero" con el siguiente c�digo


>> >
>> > cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" &
>> > "Data

>> > Source = " & EntornoDatos1 & ";" 'Abr�mos el cat�logo


>> > Set tbl = cat.Tables("Plan")
>> > With Col 'Especificamos las
>> > propiedades
>> > del campo
>> > Set .ParentCatalog = cat
>> > .Name = "Prov"
>> > .Type = adVarWChar
>> > .DefinedSize = 2
>> > .Attributes = adColNullable
>> > .Properties("Jet OLEdB:Allow Zero Length") = True
>> > End With

>> > tbl.Columns.Append Col 'A�adimos la


>> > columna a la tabla
>> > .......
>> >

>> > al hacer el Append Col de la �ltima sentencia expuesta me produce el
>> > rror
>> > --2147217887 "La operaci�n de m�ltiples pasos de OLE DB gener�


>> > errores. Compruebe los valores de estado de OLE DB si es posible. No se

>> > realiz� ning�n trabajo". (No se como comprobar los valores de
>> > estado...)
>> >
>> > Si quito la instrucci�n .Properties("Jet.......) todo corre
>> > perfectamente
>> > pero me a�ade la columna sin admitir campo de longitud cero.
>> >
>> > Cosa similar ocurre al crear una BD nueva con el siguiente c�digo (que


>> > limito a lo que aqui interesa)
>> >
>> > Public Sub CrearTablaPlan(bErr As Boolean, Handle As Long)
>> > '
>> > Set cat = New ADOX.Catalog
>> > Set tbl = New ADOX.Table
>> > '

>> > ' Abrir el cat�logo


>> > cat.ActiveConnection = strConn
>> > '
>> > ' Crear la nueva tabla
>> > With tbl
>> > .Name = "Plan"
>> > Set .ParentCatalog = cat

>> > ' Crear los campos y a�adirlos a

>> > la
>> > tabla.
>> > .Columns.Append "Prov", adVarWChar, 2
>> > ..................
>> > ......................
>> >
>> > .Columns("Prov").Attributes = adColNullable
>> > .Columns("Prov").Properties("Jet OLEDB.4.0:Allow Zero
>> > Length").value
>> > = True
>> >
>> > End With
>> > '

>> > ' A�adir la nueva tabla a la

>> > base
>> > de
>> > datos
>> > cat.Tables.Append tbl
>> > '
>> > Set tbl = Nothing
>> > Set cat = Nothing
>> > Exit Sub
>> >

>> > En este caso en la l�nea Columns("Prov").Properties("Jet
>> > OLEDB.4.0:Allow
>> > Zero Length").value = True, me salta el error 3265 "No se encontr� el
>> > elemento en la colecci�n que corresponde con el nombre o el ordinal
>> > pedido".
>> >
>> > �Alguien me puede revisar el c�digo y decirme que es lo que estoy
>> > haciendio
>> > mal? Lo agradecer�a enormemente porque es lo �nico que me falta para


>> > finalizar el proyecto y en tanto no lo resuelva, no me sirve de nada.
>> > �Puede
>> > faltame alguna Referencia? porque el error del segundo caso parece que
>> > puede

>> > venir por ah� ya que escribir el c�digo despues de Properties lo que me
>> > pide
>> > es un �ndice. He probado con el �ndice 13 que es el equivalente, pero

>> > da
>> > el
>> > mismo error.He revisado Google durante mas de un mes para buscar una

>> > soluci�n


>> > y parece que todo lo tengo bien, pero no es asi.
>> >

>> > Muy agradecido de antemano y perd�n por la extensi�n pero he querido
>> > dar
>> > las
>> > m�ximas pistas posible.
>> > Un saludo a tod@as
>>
>>
>>


Eko

unread,
Oct 1, 2008, 4:03:01 PM10/1/08
to
Perfecto, funciona, pero....
El problema es que para sim`plificar solo te envié un trozo del código y la
realidad es que debo añadir dos columnas.
Agrego dos veces la parte de código nuevo que me has pasado y Oh! cosas
curiosas. Al añadir la primera columna funciona para esa columna, pero al
añadir a continuación la segunda, produce el mismo error que antes. Si
invierto el orden de creación, pasa lo mismo, la primera, que antes era la
segunda, la crea bien pero la segunda que antes era la primera, falla (todo
ello sin incluir tras la primera el "set cat=nothing", por supuesto.
Si tienes alguna pista se te agradecera eternamente y sino, pues tambien ya
que a lo mejor tendré que hacerlo en dos rutinas diferentes para que
funcione, pero no me parece lo mas correcto.
Muy agradecido, en cualquier caso

"Victor Koch" wrote:

> Hola Eko,
>
> A ver proba con esto
>
> >> With col
> >> Set .ParentCatalog = cat
> >> .Name = "Prov"
> >> .Type = adVarWChar
> >> .DefinedSize = 2
> >> .Attributes = adColNullable
> >> End With
> >> tbl.Columns.Append col
> >> tbl.Columns.Refresh
>
> cat.Tables("Plan").Columns("Prov").Properties("Jet OLEDB:Allow Zero
> Length").Value = True
> cat.Tables("Plan").Columns("Prov").Properties.Refresh
>
>
> >>
> >> Set cat = Nothing
>
>
> --

> Un Saludo, Víctor Koch
>
>
>
> "Eko" <E...@discussions.microsoft.com> escribió en el mensaje

> news:2904FA59-9CBC-437D...@microsoft.com...
> > Hola Victor,
> >
> > En primer lugar, muchas gracias por contestar.

> > He probado el código que me envías y me crea la columna como "No permitir
> > longitud cero". Uso Access 2000 y en algún sitio ya había leido que por


> > defecto la creaba al contrario, pero por lo visto no es asi.
> >

> > Me está volviendo loco el asunto, ya que tengo paralizado el proyecto por
> > culpa de esa tontería que no encuentro modo de resolverla. ¿Alguna otra

> >> Un Saludo, Víctor Koch
> >>
> >>
> >>
> >> "Eko" <E...@discussions.microsoft.com> escribió en el mensaje


> >> news:C11DCD47-B5FC-4F6B...@microsoft.com...
> >> > Estimados amigos. Estoy finalizando un proyecto con VB6 y Access que me
> >> > ha

> >> > venido funcionando correctamente en la creación de las bases de datos y


> >> > sus
> >> > Tablas, pero tengo el siguiente problema.

> >> > Si la base de datos ya está creada y a una tabla le añado una columna
> >> > que
> >> > necesito admita "longitud cero" con el siguiente código


> >> >
> >> > cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" &
> >> > "Data

> >> > Source = " & EntornoDatos1 & ";" 'Abrímos el catálogo


> >> > Set tbl = cat.Tables("Plan")
> >> > With Col 'Especificamos las
> >> > propiedades
> >> > del campo
> >> > Set .ParentCatalog = cat
> >> > .Name = "Prov"
> >> > .Type = adVarWChar
> >> > .DefinedSize = 2
> >> > .Attributes = adColNullable
> >> > .Properties("Jet OLEdB:Allow Zero Length") = True
> >> > End With

> >> > tbl.Columns.Append Col 'Añadimos la


> >> > columna a la tabla
> >> > .......
> >> >

> >> > al hacer el Append Col de la última sentencia expuesta me produce el
> >> > rror


> >> > --2147217887 "La operación de múltiples pasos de OLE DB generó

> >> > errores. Compruebe los valores de estado de OLE DB si es posible. No se

> >> > realizó ningún trabajo". (No se como comprobar los valores de
> >> > estado...)
> >> >
> >> > Si quito la instrucción .Properties("Jet.......) todo corre
> >> > perfectamente
> >> > pero me añade la columna sin admitir campo de longitud cero.
> >> >
> >> > Cosa similar ocurre al crear una BD nueva con el siguiente código (que


> >> > limito a lo que aqui interesa)
> >> >
> >> > Public Sub CrearTablaPlan(bErr As Boolean, Handle As Long)
> >> > '
> >> > Set cat = New ADOX.Catalog
> >> > Set tbl = New ADOX.Table
> >> > '

> >> > ' Abrir el catálogo


> >> > cat.ActiveConnection = strConn
> >> > '
> >> > ' Crear la nueva tabla
> >> > With tbl
> >> > .Name = "Plan"
> >> > Set .ParentCatalog = cat

> >> > ' Crear los campos y añadirlos a

> >> > la
> >> > tabla.
> >> > .Columns.Append "Prov", adVarWChar, 2
> >> > ..................
> >> > ......................
> >> >
> >> > .Columns("Prov").Attributes = adColNullable
> >> > .Columns("Prov").Properties("Jet OLEDB.4.0:Allow Zero
> >> > Length").value
> >> > = True
> >> >
> >> > End With
> >> > '

> >> > ' Añadir la nueva tabla a la

> >> > base
> >> > de
> >> > datos
> >> > cat.Tables.Append tbl
> >> > '
> >> > Set tbl = Nothing
> >> > Set cat = Nothing
> >> > Exit Sub
> >> >

> >> > En este caso en la línea Columns("Prov").Properties("Jet
> >> > OLEDB.4.0:Allow


> >> > Zero Length").value = True, me salta el error 3265 "No se encontró el

> >> > elemento en la colección que corresponde con el nombre o el ordinal
> >> > pedido".
> >> >
> >> > ¿Alguien me puede revisar el código y decirme que es lo que estoy
> >> > haciendio
> >> > mal? Lo agradecería enormemente porque es lo único que me falta para


> >> > finalizar el proyecto y en tanto no lo resuelva, no me sirve de nada.
> >> > ¿Puede
> >> > faltame alguna Referencia? porque el error del segundo caso parece que
> >> > puede

> >> > venir por ahí ya que escribir el código despues de Properties lo que me
> >> > pide
> >> > es un índice. He probado con el índice 13 que es el equivalente, pero

> >> > da
> >> > el
> >> > mismo error.He revisado Google durante mas de un mes para buscar una

> >> > solución


> >> > y parece que todo lo tengo bien, pero no es asi.
> >> >

> >> > Muy agradecido de antemano y perdón por la extensión pero he querido
> >> > dar
> >> > las
> >> > máximas pistas posible.
> >> > Un saludo a tod@as
> >>
> >>
> >>
>
>
>

Victor Koch arroba punto punto punto

unread,
Oct 1, 2008, 5:03:48 PM10/1/08
to
Hola Eko,

La verdad que para evitarme dolores de cabeza lo que yo hago en mi sistema
es agregar el campo en la tabla usando c�digo DDL y luego uso ADOX para
cambiar esa propiedad.

Por ejemplo para tu caso yo har�a, suponiendo el objeto Cn As
Adodb.Connection previamente abierto:

Dim Sql as string

Sql="ALTER TABLE Plan ADD Prov TEXT(2) NULL"

Cn.Execute Sql, , adCmdText + adExecuteNoRecords
Call PermitirLongitudCero(Cn,"Plan","Prov", True)
''''' Salir

Este es el procedimiento que debe ir en un modulo Bas.

Sub PermitirLongitudCero(Base As ADODB.Connection, Tabla As String, Campo As
String, Permitir As Boolean)

'+-+ Cambia Propiedad AllowZeroLength

On Error Resume Next

Dim CAT As ADOX.Catalog
Set CAT = New ADOX.Catalog

Set CAT.ActiveConnection = Base

CAT.Tables(Tabla).Columns.Refresh
CAT.Tables(Tabla).Columns(Campo).Properties("Jet OLEDB:Allow Zero
Length").Value = Permitir
CAT.Tables(Tabla).Columns(Campo).Properties.Refresh

Set CAT = Nothing
Err.Clear

End Sub


--
Un Saludo, V�ctor Koch

"Eko" <E...@discussions.microsoft.com> escribi� en el mensaje

news:49A273AD-3E8F-4FF6...@microsoft.com...
> Perfecto, funciona, pero....
> El problema es que para sim`plificar solo te envi� un trozo del c�digo y
> la
> realidad es que debo a�adir dos columnas.
> Agrego dos veces la parte de c�digo nuevo que me has pasado y Oh! cosas
> curiosas. Al a�adir la primera columna funciona para esa columna, pero al
> a�adir a continuaci�n la segunda, produce el mismo error que antes. Si
> invierto el orden de creaci�n, pasa lo mismo, la primera, que antes era la


> segunda, la crea bien pero la segunda que antes era la primera, falla
> (todo
> ello sin incluir tras la primera el "set cat=nothing", por supuesto.
> Si tienes alguna pista se te agradecera eternamente y sino, pues tambien
> ya

> que a lo mejor tendr� que hacerlo en dos rutinas diferentes para que


> funcione, pero no me parece lo mas correcto.
> Muy agradecido, en cualquier caso
>
> "Victor Koch" wrote:
>
>> Hola Eko,
>>
>> A ver proba con esto
>>
>> >> With col
>> >> Set .ParentCatalog = cat
>> >> .Name = "Prov"
>> >> .Type = adVarWChar
>> >> .DefinedSize = 2
>> >> .Attributes = adColNullable
>> >> End With
>> >> tbl.Columns.Append col
>> >> tbl.Columns.Refresh
>>
>> cat.Tables("Plan").Columns("Prov").Properties("Jet OLEDB:Allow
>> Zero
>> Length").Value = True
>> cat.Tables("Plan").Columns("Prov").Properties.Refresh
>>
>>
>> >>
>> >> Set cat = Nothing
>>
>>
>> --

>> Un Saludo, V�ctor Koch
>>
>>
>>

>> "Eko" <E...@discussions.microsoft.com> escribi� en el mensaje


>> news:2904FA59-9CBC-437D...@microsoft.com...
>> > Hola Victor,
>> >
>> > En primer lugar, muchas gracias por contestar.

>> > He probado el c�digo que me env�as y me crea la columna como "No
>> > permitir
>> > longitud cero". Uso Access 2000 y en alg�n sitio ya hab�a leido que por


>> > defecto la creaba al contrario, pero por lo visto no es asi.
>> >

>> > Me est� volviendo loco el asunto, ya que tengo paralizado el proyecto
>> > por
>> > culpa de esa tonter�a que no encuentro modo de resolverla. �Alguna otra

>> >> Un Saludo, V�ctor Koch
>> >>
>> >>
>> >>

>> >> "Eko" <E...@discussions.microsoft.com> escribi� en el mensaje


>> >> news:C11DCD47-B5FC-4F6B...@microsoft.com...
>> >> > Estimados amigos. Estoy finalizando un proyecto con VB6 y Access que
>> >> > me
>> >> > ha

>> >> > venido funcionando correctamente en la creaci�n de las bases de

>> >> > datos y
>> >> > sus
>> >> > Tablas, pero tengo el siguiente problema.

>> >> > Si la base de datos ya est� creada y a una tabla le a�ado una
>> >> > columna
>> >> > que
>> >> > necesito admita "longitud cero" con el siguiente c�digo


>> >> >
>> >> > cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" &
>> >> > "Data

>> >> > Source = " & EntornoDatos1 & ";" 'Abr�mos el cat�logo

>> >> > Set tbl = cat.Tables("Plan")
>> >> > With Col 'Especificamos las
>> >> > propiedades
>> >> > del campo
>> >> > Set .ParentCatalog = cat
>> >> > .Name = "Prov"
>> >> > .Type = adVarWChar
>> >> > .DefinedSize = 2
>> >> > .Attributes = adColNullable
>> >> > .Properties("Jet OLEdB:Allow Zero Length") = True
>> >> > End With

>> >> > tbl.Columns.Append Col 'A�adimos

>> >> > la
>> >> > columna a la tabla
>> >> > .......
>> >> >

>> >> > al hacer el Append Col de la �ltima sentencia expuesta me produce el
>> >> > rror


>> >> > --2147217887 "La operaci�n de m�ltiples pasos de OLE DB
>> >> > gener�

>> >> > errores. Compruebe los valores de estado de OLE DB si es posible. No
>> >> > se

>> >> > realiz� ning�n trabajo". (No se como comprobar los valores de
>> >> > estado...)
>> >> >
>> >> > Si quito la instrucci�n .Properties("Jet.......) todo corre
>> >> > perfectamente
>> >> > pero me a�ade la columna sin admitir campo de longitud cero.
>> >> >
>> >> > Cosa similar ocurre al crear una BD nueva con el siguiente c�digo

>> >> > (que
>> >> > limito a lo que aqui interesa)
>> >> >
>> >> > Public Sub CrearTablaPlan(bErr As Boolean, Handle As Long)
>> >> > '
>> >> > Set cat = New ADOX.Catalog
>> >> > Set tbl = New ADOX.Table
>> >> > '

>> >> > ' Abrir el cat�logo


>> >> > cat.ActiveConnection = strConn
>> >> > '
>> >> > ' Crear la nueva tabla
>> >> > With tbl
>> >> > .Name = "Plan"
>> >> > Set .ParentCatalog = cat
>> >> > ' Crear los campos y

>> >> > a�adirlos a


>> >> > la
>> >> > tabla.
>> >> > .Columns.Append "Prov", adVarWChar, 2
>> >> > ..................
>> >> > ......................
>> >> >
>> >> > .Columns("Prov").Attributes = adColNullable
>> >> > .Columns("Prov").Properties("Jet OLEDB.4.0:Allow Zero
>> >> > Length").value
>> >> > = True
>> >> >
>> >> > End With
>> >> > '

>> >> > ' A�adir la nueva tabla a la


>> >> > base
>> >> > de
>> >> > datos
>> >> > cat.Tables.Append tbl
>> >> > '
>> >> > Set tbl = Nothing
>> >> > Set cat = Nothing
>> >> > Exit Sub
>> >> >

>> >> > En este caso en la l�nea Columns("Prov").Properties("Jet
>> >> > OLEDB.4.0:Allow


>> >> > Zero Length").value = True, me salta el error 3265 "No se encontr�
>> >> > el

>> >> > elemento en la colecci�n que corresponde con el nombre o el ordinal
>> >> > pedido".
>> >> >
>> >> > �Alguien me puede revisar el c�digo y decirme que es lo que estoy
>> >> > haciendio
>> >> > mal? Lo agradecer�a enormemente porque es lo �nico que me falta para


>> >> > finalizar el proyecto y en tanto no lo resuelva, no me sirve de
>> >> > nada.
>> >> > �Puede
>> >> > faltame alguna Referencia? porque el error del segundo caso parece
>> >> > que
>> >> > puede

>> >> > venir por ah� ya que escribir el c�digo despues de Properties lo que
>> >> > me
>> >> > pide
>> >> > es un �ndice. He probado con el �ndice 13 que es el equivalente,

>> >> > pero
>> >> > da
>> >> > el
>> >> > mismo error.He revisado Google durante mas de un mes para buscar una

>> >> > soluci�n


>> >> > y parece que todo lo tengo bien, pero no es asi.
>> >> >

>> >> > Muy agradecido de antemano y perd�n por la extensi�n pero he querido
>> >> > dar
>> >> > las
>> >> > m�ximas pistas posible.
>> >> > Un saludo a tod@as
>> >>
>> >>
>> >>
>>
>>
>>


Eko

unread,
Oct 1, 2008, 5:18:01 PM10/1/08
to
Probaré lo que me dices, pero entretanto he encontrado la posible solucion.
En el código para la segunda columna antepongo

Set cat = New ADOX.Catalog
Set tbl = New ADOX.Table

Set Col = New ADOX.Column

y ya la crea correctamente.
Da la impresion como si al crear la primera destruyera los objetos cat, tbl
y col teniendo de hacerle un nuevo set.

Ahora me queda ingeniarmelas para, con esas ideas hacerlo cuando creo nueva
base de datos y tengo que añadirle todos los campos a la tabla, entre ellos
estos dos conflictivos.

Si descubro algo te diré y si tu sabes o encuentras al me lo dices que te
estaré muy agradecido.
Ya te lo estoy porque has salvado mi Proyecto.

Un afectuosisimo saludo Victor

"Victor Koch" wrote:

> Hola Eko,
>

> La verdad que para evitarme dolores de cabeza lo que yo hago en mi sistema

> es agregar el campo en la tabla usando código DDL y luego uso ADOX para
> cambiar esa propiedad.
>
> Por ejemplo para tu caso yo haría, suponiendo el objeto Cn As

> Adodb.Connection previamente abierto:
>
> Dim Sql as string
>
> Sql="ALTER TABLE Plan ADD Prov TEXT(2) NULL"
>
> Cn.Execute Sql, , adCmdText + adExecuteNoRecords
> Call PermitirLongitudCero(Cn,"Plan","Prov", True)
> ''''' Salir
>
> Este es el procedimiento que debe ir en un modulo Bas.
>
> Sub PermitirLongitudCero(Base As ADODB.Connection, Tabla As String, Campo As
> String, Permitir As Boolean)
>
> '+-+ Cambia Propiedad AllowZeroLength
>
> On Error Resume Next
>
> Dim CAT As ADOX.Catalog
> Set CAT = New ADOX.Catalog
>
> Set CAT.ActiveConnection = Base
>
> CAT.Tables(Tabla).Columns.Refresh
> CAT.Tables(Tabla).Columns(Campo).Properties("Jet OLEDB:Allow Zero
> Length").Value = Permitir
> CAT.Tables(Tabla).Columns(Campo).Properties.Refresh
>
> Set CAT = Nothing
> Err.Clear
>
> End Sub
>
>
> --

> Un Saludo, Víctor Koch
>
>
>
> "Eko" <E...@discussions.microsoft.com> escribió en el mensaje

> news:49A273AD-3E8F-4FF6...@microsoft.com...
> > Perfecto, funciona, pero....

> > El problema es que para sim`plificar solo te envié un trozo del código y
> > la
> > realidad es que debo añadir dos columnas.
> > Agrego dos veces la parte de código nuevo que me has pasado y Oh! cosas
> > curiosas. Al añadir la primera columna funciona para esa columna, pero al
> > añadir a continuación la segunda, produce el mismo error que antes. Si
> > invierto el orden de creación, pasa lo mismo, la primera, que antes era la


> > segunda, la crea bien pero la segunda que antes era la primera, falla
> > (todo
> > ello sin incluir tras la primera el "set cat=nothing", por supuesto.
> > Si tienes alguna pista se te agradecera eternamente y sino, pues tambien
> > ya

> > que a lo mejor tendré que hacerlo en dos rutinas diferentes para que


> > funcione, pero no me parece lo mas correcto.
> > Muy agradecido, en cualquier caso
> >
> > "Victor Koch" wrote:
> >
> >> Hola Eko,
> >>
> >> A ver proba con esto
> >>
> >> >> With col
> >> >> Set .ParentCatalog = cat
> >> >> .Name = "Prov"
> >> >> .Type = adVarWChar
> >> >> .DefinedSize = 2
> >> >> .Attributes = adColNullable
> >> >> End With
> >> >> tbl.Columns.Append col
> >> >> tbl.Columns.Refresh
> >>
> >> cat.Tables("Plan").Columns("Prov").Properties("Jet OLEDB:Allow
> >> Zero
> >> Length").Value = True
> >> cat.Tables("Plan").Columns("Prov").Properties.Refresh
> >>
> >>
> >> >>
> >> >> Set cat = Nothing
> >>
> >>
> >> --

> >> Un Saludo, Víctor Koch
> >>
> >>
> >>
> >> "Eko" <E...@discussions.microsoft.com> escribió en el mensaje


> >> news:2904FA59-9CBC-437D...@microsoft.com...
> >> > Hola Victor,
> >> >
> >> > En primer lugar, muchas gracias por contestar.

> >> > He probado el código que me envías y me crea la columna como "No
> >> > permitir
> >> > longitud cero". Uso Access 2000 y en algún sitio ya había leido que por


> >> > defecto la creaba al contrario, pero por lo visto no es asi.
> >> >

> >> > Me está volviendo loco el asunto, ya que tengo paralizado el proyecto
> >> > por
> >> > culpa de esa tontería que no encuentro modo de resolverla. ¿Alguna otra

> >> >> Un Saludo, Víctor Koch
> >> >>
> >> >>
> >> >>
> >> >> "Eko" <E...@discussions.microsoft.com> escribió en el mensaje


> >> >> news:C11DCD47-B5FC-4F6B...@microsoft.com...
> >> >> > Estimados amigos. Estoy finalizando un proyecto con VB6 y Access que
> >> >> > me
> >> >> > ha

> >> >> > venido funcionando correctamente en la creación de las bases de

> >> >> > datos y
> >> >> > sus
> >> >> > Tablas, pero tengo el siguiente problema.

> >> >> > Si la base de datos ya está creada y a una tabla le añado una
> >> >> > columna
> >> >> > que
> >> >> > necesito admita "longitud cero" con el siguiente código


> >> >> >
> >> >> > cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" &
> >> >> > "Data

> >> >> > Source = " & EntornoDatos1 & ";" 'Abrímos el catálogo


> >> >> > Set tbl = cat.Tables("Plan")
> >> >> > With Col 'Especificamos las
> >> >> > propiedades
> >> >> > del campo
> >> >> > Set .ParentCatalog = cat
> >> >> > .Name = "Prov"
> >> >> > .Type = adVarWChar
> >> >> > .DefinedSize = 2
> >> >> > .Attributes = adColNullable
> >> >> > .Properties("Jet OLEdB:Allow Zero Length") = True
> >> >> > End With

> >> >> > tbl.Columns.Append Col 'Añadimos

> >> >> > la
> >> >> > columna a la tabla
> >> >> > .......
> >> >> >

> >> >> > al hacer el Append Col de la última sentencia expuesta me produce el
> >> >> > rror


> >> >> > --2147217887 "La operación de múltiples pasos de OLE DB
> >> >> > generó

> >> >> > errores. Compruebe los valores de estado de OLE DB si es posible. No
> >> >> > se

> >> >> > realizó ningún trabajo". (No se como comprobar los valores de
> >> >> > estado...)
> >> >> >
> >> >> > Si quito la instrucción .Properties("Jet.......) todo corre
> >> >> > perfectamente
> >> >> > pero me añade la columna sin admitir campo de longitud cero.
> >> >> >
> >> >> > Cosa similar ocurre al crear una BD nueva con el siguiente código

> >> >> > (que
> >> >> > limito a lo que aqui interesa)
> >> >> >
> >> >> > Public Sub CrearTablaPlan(bErr As Boolean, Handle As Long)
> >> >> > '
> >> >> > Set cat = New ADOX.Catalog
> >> >> > Set tbl = New ADOX.Table
> >> >> > '

> >> >> > ' Abrir el catálogo


> >> >> > cat.ActiveConnection = strConn
> >> >> > '
> >> >> > ' Crear la nueva tabla
> >> >> > With tbl
> >> >> > .Name = "Plan"
> >> >> > Set .ParentCatalog = cat
> >> >> > ' Crear los campos y

> >> >> > añadirlos a


> >> >> > la
> >> >> > tabla.
> >> >> > .Columns.Append "Prov", adVarWChar, 2
> >> >> > ..................
> >> >> > ......................
> >> >> >
> >> >> > .Columns("Prov").Attributes = adColNullable
> >> >> > .Columns("Prov").Properties("Jet OLEDB.4.0:Allow Zero
> >> >> > Length").value
> >> >> > = True
> >> >> >
> >> >> > End With
> >> >> > '

> >> >> > ' Añadir la nueva tabla a la


> >> >> > base
> >> >> > de
> >> >> > datos
> >> >> > cat.Tables.Append tbl
> >> >> > '
> >> >> > Set tbl = Nothing
> >> >> > Set cat = Nothing
> >> >> > Exit Sub
> >> >> >

> >> >> > En este caso en la línea Columns("Prov").Properties("Jet
> >> >> > OLEDB.4.0:Allow


> >> >> > Zero Length").value = True, me salta el error 3265 "No se encontró
> >> >> > el

> >> >> > elemento en la colección que corresponde con el nombre o el ordinal
> >> >> > pedido".
> >> >> >
> >> >> > ¿Alguien me puede revisar el código y decirme que es lo que estoy
> >> >> > haciendio
> >> >> > mal? Lo agradecería enormemente porque es lo único que me falta para


> >> >> > finalizar el proyecto y en tanto no lo resuelva, no me sirve de
> >> >> > nada.
> >> >> > ¿Puede
> >> >> > faltame alguna Referencia? porque el error del segundo caso parece
> >> >> > que
> >> >> > puede

> >> >> > venir por ahí ya que escribir el código despues de Properties lo que
> >> >> > me
> >> >> > pide
> >> >> > es un índice. He probado con el índice 13 que es el equivalente,

> >> >> > pero
> >> >> > da
> >> >> > el
> >> >> > mismo error.He revisado Google durante mas de un mes para buscar una

> >> >> > solución


> >> >> > y parece que todo lo tengo bien, pero no es asi.
> >> >> >

> >> >> > Muy agradecido de antemano y perdón por la extensión pero he querido
> >> >> > dar
> >> >> > las
> >> >> > máximas pistas posible.
> >> >> > Un saludo a tod@as
> >> >>
> >> >>
> >> >>
> >>
> >>
> >>
>
>
>

Eko

unread,
Oct 2, 2008, 1:10:01 PM10/2/08
to
Amigo Victos.
Muchisimas gracias por tu valiosísima ayuda.

Con tu idea de crear un procedimiento separada al que le paso la conexxión,
la tabla y el campo, me funciona perfectamente ya que al llamarla para cada
campo y setear de nuevo los objetos, ya no hay problema alguno.

Me has salvado el proyecto. Te lo debo a ti.

Muchisimas gracias.

P.D. Por simple curiosidad ¿sabes con que código puedo cambiar el atributo
de un campo existente de "requerido" a "no requerido" o a la inversa?
Esto ya no me es tan importante pero mejoraría la aplicación.
Nuevamente GRACIASSSSS


Victor Koch arroba punto punto punto

unread,
Oct 2, 2008, 1:39:23 PM10/2/08
to
Hola Eko,

Me alegra que te haya servido.

Con respecto a tu pregunta requerido o no requerido eso lo podes manejar o
definir en el ALTER TABLE, si pones NOT NULL entonces el campo sera
requerido, si pone NULL sera no requerido, ejemplo

ALTER TABLE Plan ADD Prov TEXT(2) NULL << No requerido

ALTER TABLE Plan ADD Prov TEXT(2) NOT NULL << Requerido


--
Un Saludo, V�ctor Koch

"Eko" <E...@discussions.microsoft.com> escribi� en el mensaje

news:9ACE8E1B-646E-45F7...@microsoft.com...
> Amigo Victos.
> Muchisimas gracias por tu valios�sima ayuda.


>
> Con tu idea de crear un procedimiento separada al que le paso la

> conexxi�n,


> la tabla y el campo, me funciona perfectamente ya que al llamarla para
> cada
> campo y setear de nuevo los objetos, ya no hay problema alguno.
>
> Me has salvado el proyecto. Te lo debo a ti.
>
> Muchisimas gracias.
>

> P.D. Por simple curiosidad �sabes con que c�digo puedo cambiar el atributo


> de un campo existente de "requerido" a "no requerido" o a la inversa?

> Esto ya no me es tan importante pero mejorar�a la aplicaci�n.
> Nuevamente GRACIASSSSS
>
>


0 new messages