Fecha Inicial : 05/04/2018
Fecha Final :  05/04/2018
Hora Inicio: 11:31 PM
Hora Final: 4:17
Horas invertidas(Minutos): 226 
Colaboradores: Wilson Lopez Oscar Cortes

Actividad:
Reparar XML para arreglar inconsistencias en ellos

Iniciar el procedimiento almacenado recursivo para la lectura de los datos en los xml,para esto se le realizan diversas modificaciones al scrip inicial de la base de datos 
Código: 


create table Periodo(
    ID integer primary key identity (1,1),
    Estado nvarchar(50) not null,
    FechaI datetime not null,
    FechaF datetime not null
);


create table EstadoGrupo(
    ID integer primary key identity (1,1),
    Nombre nvarchar(50) not null unique
);

create TABLE Profesor(
    ID int primary key identity(1,1),
    Nombre nvarchar(50) not null,
    Email nvarchar(50) not null,
    contrasenna nvarchar(50) not null,
)

create TABLE Grupo(
    ID int primary key identity(1,1),
    FK_Estado int foreign key references EstadoGrupo(ID),
    FK_Periodo int foreign key references Periodo(ID),
    FK_Profesor int foreign key references Profesor(ID),

    NombreCurso nvarchar(50) not null,
    CodigoGrupo nvarchar(50) not null   
)



create table EstadoEstudiante(
    ID int primary key identity(1,1),
    Nombre nvarchar(50) not null unique
)


create table Estudiante (
    ID int primary key identity(1,1),
    Nombre nvarchar(50) not null,
    Apellido nvarchar(50) not null,
    Telefono int not null,
    Email nvarchar(50) not null,
    Carne nvarchar(50) not null unique
)


create TABLE GrupoxEstudiante(
    ID int primary key identity(1,1),
    FK_Grupo int not null foreign key references Grupo(ID),
    FK_Estado int not null foreign key references EstadoEstudiante(ID),
    FK_Estudiante int not null foreign key references Estudiante(ID),
    NotaAcumulada int not null
)


create Table Rubros(
    ID int primary key identity(1,1),
    Nombre nvarchar(50) not null unique
)


create table GrupoxRubro(
    ID int primary key identity(1,1),
    FK_Grupo int not null foreign key references Grupo(ID),
    FK_Rubro int not null foreign key references Rubros(ID),
    Valor nvarchar(50) not null,
    EsFijo char(1), check((EsFijo = 'y') or (EsFijo = 'n')),
    Q int not null
)

create table Evaluacion(
    ID int primary key identity(1,1),
    FK_Grupo_Rubro int not null foreign key references GrupoxRubro(ID),
    Nombre nvarchar(50) not null,
    Fecha datetime not null,
    ValorPorcentual int not null,
    Descripcion nvarchar(50) not null
)


create table EvaluacionxEstudiante (
    ID int primary key identity(1,1),
    FK_Grupo_Estudiante int not null foreign key references GrupoxEstudiante(ID),
    FK_Evaluacion int not null foreign key references Evaluacion(ID),
    Nota int not null
)

Se crean nuevos procedimientos almacenados para manejar el proceso recursivo: 

Código:


CREATE PROCEDURE VaciarTablas
AS
BEGIN
    EXEC sp_MSForEachTable 'DISABLE TRIGGER ALL ON ?';
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL';
    EXEC sp_MSForEachTable 'DELETE FROM ?';
    EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL';
    EXEC sp_MSForEachTable 'ENABLE TRIGGER ALL ON ?';
    EXEC sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED, 0)'
END
GO

CREATE PROCEDURE [dbo].[readXML_studentGroupStateData]
    
AS
BEGIN
DECLARE @xml xml
    DECLARE @hdoc int
    BEGIN TRY
        SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data\studentGroupStateData.xml', SINGLE_BLOB) as studentGroupStateData(roow)
        if (@xml IS NOT NULL)
        begin
            begin tran
                EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml

                SELECT * INTO #tmp_studentGroupStateData FROM OPENXML(@hDoc, 'XML/studentGroupStateData/studentGroupState')
                WITH(

                    name [nvarchar](50)
                )
                begin
                    INSERT INTO EstadoEstudiante(Nombre) SELECT name FROM #tmp_studentGroupStateData
                    --EXEC dbo.Create_teacherData @Name = name,@Email = email,@Password = password;
                end
                DROP TABLE #tmp_studentGroupStateData
        end
        commit tran
        return 1 --successful
    END TRY
    BEGIN CATCH
            IF @@TRANCOUNT > 0 ROLLBACK;
            return 0 --failed
    END CATCH
END
GO

CREATE PROCEDURE readXML_studentData
    
AS
BEGIN
    DECLARE @xml xml
    DECLARE @hdoc int
    BEGIN TRY
        SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data\studentData.xml', SINGLE_BLOB) as studentData(roow)
        if (@xml IS NOT NULL)
        begin
            begin tran
                EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml

                SELECT * INTO #tmp_studentData FROM OPENXML(@hDoc, 'XML/studentData/student')
                WITH(

                    name [nvarchar](50),
                    lastName[nvarchar](50),
                    email [nvarchar](50),
                    carnet [nvarchar](50),
                    phone[int]
                )
                begin
                    INSERT INTO Estudiante(Nombre,Apellido,Email,Carne,Telefono)SELECT name,lastName,email,carnet,phone FROM #tmp_studentData
                    --EXEC dbo.Create_teacherData @Name = name,@Email = email,@Password = password;
                end
                DROP TABLE #tmp_studentData
        end
        commit tran
        return 1 --successful
    END TRY
    BEGIN CATCH
            IF @@TRANCOUNT > 0 ROLLBACK;
            return 0 --failed
    END CATCH
END
GO

CREATE PROCEDURE [dbo].[readXML_teacherData]

AS
BEGIN
    DECLARE @xml xml
    DECLARE @hdoc int
    DECLARE @pName nvarchar
    DECLARE @pEmail nvarchar
    DECLARE @pPassword nvarchar
    
    


    BEGIN TRY
        SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data\teacherData.xml', SINGLE_BLOB) as teacherData(roow)
        if (@xml IS NOT NULL)
        begin
            begin tran
                EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml

                SELECT * INTO #tmp_teacherData FROM OPENXML(@hDoc, 'XML/teacherData/teacher')
                WITH(

                    name [nvarchar](50),
                    email [nvarchar](50),
                    password [nvarchar](50)
                )
                begin
                    
                    INSERT INTO Profesor (Nombre,Email,contrasenna) SELECT name,email,password FROM #tmp_teacherData
                    --EXEC dbo.Create_teacherData @Name = name,@Email = email,@Password = password;
                end
                DROP TABLE #tmp_teacherData
        end
        commit tran
        return 1 --successful
    END TRY
    BEGIN CATCH
            IF @@TRANCOUNT > 0 ROLLBACK;
            return 0 --failed
    END CATCH
    END
    GO
CREATE PROCEDURE readXML_itemData
AS
BEGIN
    DECLARE @xml xml
    DECLARE @hdoc int
    BEGIN TRY
        SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data\itemData.xml', SINGLE_BLOB) as itemData(roow)
        if (@xml IS NOT NULL)
        begin
            begin tran
                EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml

                SELECT * INTO #tmp_itemData FROM OPENXML(@hDoc, 'XML/itemData/item')
                WITH(

                    name [nvarchar](50)
                    
                )
                begin
                    INSERT INTO Rubros(Nombre)SELECT name FROM #tmp_itemData
                    --EXEC dbo.Create_teacherData @Name = name,@Email = email,@Password = password;
                end
                DROP TABLE #tmp_itemData
        end
        commit tran
        return 1 --successful
    END TRY
    BEGIN CATCH
            IF @@TRANCOUNT > 0 ROLLBACK;
            return 0 --failed
    END CATCH
END
GO

CREATE PROCEDURE readXML_groupStateData
AS
BEGIN
    DECLARE @xml xml
    DECLARE @hdoc int
    BEGIN TRY
        SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data\groupStateData.xml', SINGLE_BLOB) as groupStateData(roow)
        if (@xml IS NOT NULL)
        begin
            begin tran
                EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml

                SELECT * INTO #tmp_groupStateData FROM OPENXML(@hDoc, 'XML/groupStateData/groupState')
                WITH(

                    name [nvarchar](50)
                    
                )
                begin
                    INSERT INTO EstadoGrupo(Nombre)SELECT name FROM #tmp_groupStateData
                    --EXEC dbo.Create_teacherData @Name = name,@Email = email,@Password = password;
                end
                DROP TABLE #tmp_groupStateData
        end
        commit tran
        return 1 --successful
    END TRY
    BEGIN CATCH
            IF @@TRANCOUNT > 0 ROLLBACK;
            return 0 --failed
    END CATCH
END
GO
CREATE PROCEDURE [dbo].[readXML_groupData] @Id_Periodo int
AS
BEGIN
    DECLARE @xml xml
    DECLARE @hdoc int
    BEGIN TRY
        SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data\groupData.xml', SINGLE_BLOB) as groupData(roow)
        if (@xml IS NOT NULL)
        begin
            begin tran
                EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml

                SELECT * INTO #tmp_groupData FROM OPENXML(@hDoc, 'XML/groupData/group')
                WITH(
                     groupStateID[int],
                     teacherID[int],
                     termID[int],
                     courseName[nvarchar](50),
                     code[nvarchar](50)
                    
                )
                begin
        
                    
                    INSERT INTO Grupo(FK_Estado,FK_Profesor,FK_Periodo,NombreCurso,CodigoGrupo)SELECT groupStateID,teacherID,termID,courseName,code FROM #tmp_groupData WHERE termID = @Id_Periodo
                    --EJECUTAR GROUPITEMDATA
                end
                DROP TABLE #tmp_groupData
        end
        commit tran
        return 1 --successful
    END TRY
    BEGIN CATCH
            IF @@TRANCOUNT > 0 ROLLBACK;
            Select ERROR_MESSAGE()
            return 0 --failed
    END CATCH
END
GO

CREATE PROCEDURE readXML_groupItemData @Id_Grupo int
AS
BEGIN
    DECLARE @xml xml
    DECLARE @hdoc int
    BEGIN TRY
        SELECT @xml = roow FROM OPENROWSET (BULK 'C:\data\SQL-Data\groupItemData.xml', SINGLE_BLOB) as groupItemData(roow)
        if (@xml IS NOT NULL)
        begin
            begin tran
                EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml

                SELECT * INTO #tmp_groupItemData FROM OPENXML(@hDoc, 'XML/groupItemData/groupItem')
                WITH(
                     itemID [int],
                     groupID [int],
                     percentage [nvarchar](50),
                     count [float],
                     constantCount [nvarchar](50)
                    
                )
                begin
                    --SELECT * FROM #tmp_groupItemData
                    
                    INSERT INTO GrupoxRubro(FK_Grupo,FK_Rubro,Valor,EsFijo,Q) SELECT groupID,itemID,percentage,constantCount,count FROM #tmp_groupItemData WHERE groupID = @Id_Grupo
                    
                end
                DROP TABLE #tmp_groupItemData
        end
        commit tran
        return 1 --successful
    END TRY
    BEGIN CATCH
            IF @@TRANCOUNT > 0 ROLLBACK;
            SELECT ERROR_MESSAGE()
            return 0 --failed
    END CATCH
END



Código para la modificación de los ID en los XML

def fix_xml(pXml):
    respXML = ""
    i = 0
    
    while (i < len(pXml)):
        if pXml[i:i+2] == "ID":
            respXML += pXml[i:i+4] 
            n = ""
            i += 4
            while (pXml[i] != '"'):
                n += pXml[i]
                i+=1
            respXML += str( int(n) + 1) + '"'
        else:
            respXML += pXml[i]
            
        i+=1

    print(respXML)


            

            




Iniciar la pagina web (pausa para centrarnos en los stored procedure)


Pagina inicio


Pagina de Login



Generar los stored procedures necesarios para cargar datos


Problemas: 
Tenemos problemas con los datos de los xml pues estos inician en cero y nuestro identity inicia en uno se trata de corregir a nivel de codigo sin existo , se procede a modificar los xml realizando un aumento en uno a cada ID presente en los xmls







Comentarios