Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   problema com un xml (https://www.clubdelphi.com/foros/showthread.php?t=80943)

sidneyb 26-09-2012 22:39:00

problema com un xml
 
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;

Código:

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:

Código:

    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
Cita:

<?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
Código:

<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 Noteví 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 Noteví 26-09-2012 23:10:44

Cualquiera puede equivocarse :)


La franja horaria es GMT +2. Ahora son las 05:16:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi