PDA

Ver la Versión Completa : problema com un xml


sidneyb
26-09-2012, 22:39:00
Buen dia amigos, espero me puedan ayudar con el siguiente inconveniente

Tengo un programa en visual, este genera un xml a partir de un .DBF (codigos de barra y demas datos como descripcion del producto) para luego enviarlo a un procedimiento almacenado en un servidor SQLServer2005. este comprueba que lo contenido de la tabla DBF exista dentro de la tabla inventario del programa, el procedimiento almacenado me devuelve como resultado una lista con los codigos de barras que debo crear.

He intentado recrear solo este procedimiento dentro de un pequeño ejecutable en Delphi (leer el DBF, crear el xml y ejecutar el procedimiento almacenado con los datos del xml)

Uds me diran, por que no copio y pego y creo el mismo procedimiento de visual... el detalle esta en que aca se quiere eliminar la VB, sobre todo por que esta escrito con VB6 (algo antiguo)

A lugar... he logrado crear el xml, pero al enviarlo al SP (Stored Procedure) me suelta un error.

Mi codigo (DELPHI) es este;

procedure TFormPrincipal.BtnValidarClick(Sender: TObject);
var
Stream : TStringStream;
Nodo : IXMLNode;

begin
if FileExists('C:\Ziptemp\Movitran.DBF') = false then //Archivo Movitran
begin
Showmessage('No Existe el archivo Movitran.dbf en la carpeta C:\Ziptemp');
FormPrincipal.CloseQuery;
Abort;
end;

Try //ejecuto la consulta en el dbf
QueryDBF.Close;
QueryDBF.SQL.Clear;
QueryDBF.SQL.Text:='Select max(NumTra) as Numt, CodBarra, max(Nombre) as Nomb, ';
QueryDBF.SQL.Add('sum(Cantidad) as Canti, max(Referencia) as Refer, max(Marca) as Marc ');
QueryDBF.SQL.Add('from movitran.dbf GROUP BY CodBarra');
QueryDBF.Open;
if QueryDBF.Recordset = nil then Exit;
Stream := TStringStream.Create('');
try
// creo el .xml
QueryDBF.Recordset.Save(TStreamAdapter.Create(stream) as IUnknown, adPersistXML);
Stream.Position := 0;
XML.LoadFromStream(stream);
//elimino un nodo que no me interesa; XML = Componente TXMLDocument
XML.DocumentElement.ChildNodes.Delete('s:Schema');
XML.SaveToFile('D:\prueba.xml'); //Esta linea es solo para ir viendo como va quedando el xml
finally
Stream.Free;
end;
Except
On E: Exception do
showmessage('Error al crear archivo de informacion del DBF');
End;

//try
//aqui llamo al procedimiento almacenado
//SPSQL = componente TADOStoredProc
SPSQL.ProcedureName:='PROCESAR_MOVITRAN';
SPSQL.Parameters.CreateParameter('@strXML',ftstring, pdinput,length(xml.XML.Text),xml.XML.Text);
SPSQL.Parameters.CreateParameter('@strProceso', ftstring, pdinput, 50, 'COMPRAS');
SPSQL.ExecProc; // aca es la linea que me da el error
//except
// on E: Exception do
// ShowMessage('No se Puede Establecer Conexion al Servidor Sql con los datos suministrados');
//end;
end;

el error que me da es

Error de análisis de XML 0xc00ce553 en la línea número 0, junto al texto XML ""

el codigo usado en VB6 es:


Dim XMLDocumento As DOMDocument
Dim schemaNode As MSXML2.IXMLDOMNode
Set XMLDocumento = New DOMDocument
rcsMovArchivoExt.Save XMLDocumento, adPersistXML
With XMLDocumento
.setProperty "SelectionNamespaces", "xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'"
Set schemaNode = .selectSingleNode("//s:Schema")
With .documentElement
.removeChild schemaNode
.removeAttribute "xmlns:s"
.removeAttribute "xmlns:dt"
End With
End With

Dim xmlParametro As ADODB.Parameter
With sqlComando
.ActiveConnection = cnnConexion
.CommandText = "PROCESAR_MOVITRAN"
.CommandType = adCmdStoredProc
.Parameters.Append .CreateParameter("@strXML", adVarChar, adParamInput, Len(XMLDocumento.xml), XMLDocumento.xml)
.Parameters.Append .CreateParameter("@strProceso", adVarChar, adParamInput, 50, "COMPRAS")
rcsPrendas.Open sqlComando, , adOpenDynamic, adLockOptimistic
End With

en los archivos xml generados solo veo diferencia en las primeras lineas, que quizas es alli donde tengo el problema, les muestro

xml de delphi

<?xml version="1.0" encoding="UTF-8"?>
-<xml xmlns:z="#RowsetSchema" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882">-
<rs:data>
{Aqui van mis datos}
</rs:data>
</xml>

xml de VB6 es

<xml xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<rs:data>
</rs:data>
</xml>

Si ven, hay una diferencia en las lineas donde estan los atributos, puede que sea aqui el problema... que puedo hacer para resolver el inconveniente?

gracias por la colaboracion que me puedan prestar

Casimiro Notevi
26-09-2012, 22:57:21
Recuerda poner tus preguntas en el foro adecuado, lo has puesto en la nueva sección de "Trucos", algo que no tiene nada que ver.
Lo paso a "Varios".

sidneyb
26-09-2012, 22:59:07
gracias casimiro, veia si habia algo en trucos, honestamente no vi si publique alli

Casimiro Notevi
26-09-2012, 23:10:44
Cualquiera puede equivocarse :)