Me asalta una pregunta: Si el Postgre espera puntos decimales, y el MySQL devuelve los decimales con punto... ¿Por qué le cambias e punto por la coma?
En realidad me parece que tu problema no se está produciendo en el MySQL. Tu bien podrías dejar sin realizar el CAST que usas en la consulta y aún así podrías obtener un resultado perfecto.
Tu problema es estrictamente de
regionalización de la aplicación. El inconveniente se produce en el segmento de tu código que genera el archivo que luego será leido:
Quote
on error resume next
intCount = rs.Fields.Count - 1
do while not rs.eof 'loop to cycle through the table
tmpString = Null
for i = 0 to intCount
tmpString = rs.fields.item(i) & vbTab
if isnull(tmpString) then tmpString = vbTab
objOutFile.Write tmpString
tmpstring = Null
next
objOutFile.WriteLine 'newline
rs.MoveNext
loop
ad.close
El problema es que en ningún momento estás administrando el tipo de dato que te está llegando, de modo que si te llega nativamente como Double (lo que normalmente devolvería MySQL), situ PC está corriendo con la regionalización es-ES, por ejemplo, a los decimales los representará con comas, pero si está corriendo con regionalización neutra o en-US puede que los ponga con punto.
El tema allí es más bien controlar el modo en que interpreta los datos decimales la aplicación. No tanto la forma en que los pone MySQL.
Te recalco que el resultado final no es producto de MySQL sino de la aplicación, por lo que la importación posterior es más bien responsabilidad de lo que el Visual Basic está haciendo...
Mi experiencia es más en VB.Net que en VB clásico.
Respecto al
nul que mencionas en el primer post, el problema está dado por el LEFT JOIN, que está permitiendo la devolución de datos como NULL y que el conector convierte a
nul.
A mi entender eso se podría resolver usando funciones que eviten que la tabla venga con NULL, y que los cambie por 0, o vacío. Algo así:
Quote
SELECT
numeropedido,
tipopedido,
fecha,
oiddestino,
destino,
oidpais,
pais,
IFNULL(ped.oidproveedor,0) oidproveedor,
IFNULL(ped.proveedor,'') proveedor,
oidstock,
stock,
oidproducto,
productolargo,
producto,
cajaspedido,
confeccion,
calibre,
marca,
npiezas,
REPLACE(CAST(pesoconfeccion AS CHAR),'.',','),
cajasxpalet,
gama,
IFNULL(ped.plataformaorigen,'') plataformaorigen,
oidpedidoexport,
IFNULL(pr.oidzona,0) oidzona,
IFNULL(z.zona, '') zona
FROM
temp_pedido ped LEFT JOIN
proveedor pr ON pr.oidproveedor=ped.oidproveedor LEFT JOIN
zona z ON z.oidzona=pr.oidzona;
Aunque yo intentaría hacer esto:
Quote
SELECT
'numeropedido',
'tipopedido',
'fecha',
'oiddestino',
'destino',
'oidpais',
'pais',
'oidproveedor',
'proveedor',
'oidstock',
'stock',
'oidproducto',
'productolargo',
'producto',
'cajaspedido',
'confeccion',
'calibre',
'marca',
'npiezas',
'pesoconfeccion',
'cajasxpalet',
'gama',
'plataformaorigen',
'oidpedidoexport',
'oidzona',
'zona'
UNION
SELECT
numeropedido,
tipopedido,
fecha,
oiddestino,
destino,
oidpais,
pais,
IFNULL(ped.oidproveedor,0) oidproveedor,
IFNULL(ped.proveedor,'') proveedor,
oidstock,
stock,
oidproducto,
productolargo,
producto,
cajaspedido,
confeccion,
calibre,
marca,
npiezas,
pesoconfeccion,
cajasxpalet,
gama,
IFNULL(ped.plataformaorigen,'') plataformaorigen,
oidpedidoexport,
IFNULL(pr.oidzona,0) oidzona,
IFNULL(z.zona, '') zona
FROM
temp_pedido ped LEFT JOIN
proveedor pr ON pr.oidproveedor=ped.oidproveedor LEFT JOIN
zona z ON z.oidzona=pr.oidzona
INTO OUTFILE 'c:\\CarpetaDeGuardado\\\NombreArchivo.txt'
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n';
Eso debería dar por resultado el volcado de la consulta a disco sin necesidad de otros procesos. "c:\\CarpetaDeGuardado\\\NombreArchivo.txt", con las barras escapadas, es el nombre que debería adicionarse programáticamente según lo que desees poner y a dónde.
Estoy haciendo un UNION para hacer que salgan los encabezados de la tabla. SI no los necesitas simplemente eliminas el primer select y el UNION y deja el resto.
¿Te animarías a probarlo?