miércoles, 12 de marzo de 2014

Ocurrencias con SQLExpress

Hace poco me encontré con un inconveniente al momento iniciar mi proyecto MVC el cual utiliza la instancia SQLExpress, revisando llegue a encontrar que mi cuenta de dominio no tenia permisos en la base de datos master, para ello tengo que explicar el escenario con el cual encontré la maquina que utilizo.

En un primer momento instale todos lo aplicativos en una cuenta local de la PC, pasado ya un tiempo me dieron mi cuenta de dominio por lo cual lo tuve que unir al dominio y trabajar desde ella.

Estando ahí, genero mi proyecto de MVC y me encontré con dicho error al querer conectarse obviamente, la cuenta de dominio me permitía iniciar sesión pero no me permitía mas nada ni crear usuario y menos crear base de datos.

Solución

1. Ingresar con la cuenta local a la instancia de SQLExpress

2. Agregarle el usuario de Dominio a la instancia y darle permisos de accesos y privilegios  iguales al usuario "sa"

Considerar

1. Si tienes cuenta local y dominio, deberás elegir con la cual vas a trabajar siempre y ahi instalar Visual Studio o SQLExpress


miércoles, 18 de septiembre de 2013

Trabajar con xml desde SQL

Un xml siempre tiene diferentes usos, en este post mostrare la utilización para registrar el modelo común de cabecera y detalle con los cuales nos encontramos al momento de normalizar un documento tal como una factura, proforma y muchos mas que tenga la misma estructura.

También mostraremos un estándar para un orden al crear un procedimiento almacenado que no es obligatorio seguir pero si seria bueno que busquen mejorarlo.

Comenzando con la creación del procedimiento almacenado:

CREATE PROCEDURE [dbo].[usp_ins_Comprobante]      
(        
 @pov_NroComprobante varchar(15) output,        
 @pid_FechaEmision datetime,        
 @piv_CodigoPersona varchar(15),        
 @pii_CodigoCondicionPago int,        
 @pis_CodigoMoneda smallint,        
 @pin_MontoTotal decimal(20,4),        
 @pin_SubMonto decimal(20,4),        
 @pin_MontoIGV decimal(20,4),        
 @pin_MontoDescuento decimal(20,4),        
 @pib_FlagIGV bit,        
 @pib_FlagImpresion bit,        
 @pis_CodigoEstado smallint,        
 @piv_UsuarioRegistro char(10),        
 @pid_FechaRegistro datetime,        
 @piv_UsuarioModificacion char(10),        
 @pid_FechaModificacion datetime,        
 @pov_CodigoDocumento char(3),        
 @pib_FlagExtorno bit,        
 @pov_CodigoTerminal char(5),        
 @pid_FechaCancelacion datetime,        
 @piv_CodigoVendedor varchar(10),        
 @pin_TipoCambio decimal(5,4),        
 @piv_NroPedido varchar(15),        
 @piv_NroOrdenCompra varchar(15),        
 @piv_NroCotizacion varchar(15),        
 @piv_NroOrdenFabricacion varchar(15),        
 @piv_NroGuiasRemision varchar(15),        
 @pid_FechaVencimiento datetime,      
 @piv_XMLEntity xml      
)

INSERT INTO [Comprobante]        
 (        
  [NroComprobante],        
  [FechaEmision],        
  [CodigoPersona],        
  [CodigoCondicionPago],        
  [CodigoMoneda],        
  [MontoTotal],        
  [SubMonto],        
  [MontoIGV],        
  [MontoDescuento],        
  [FlagIGV],        
  [FlagImpresion],        
  [CodigoEstado],        
  [UsuarioRegistro],        
  [FechaRegistro],        
  [UsuarioModificacion],        
  [FechaModificacion],        
  [CodigoDocumento],        
  [FlagExtorno],        
  [CodigoTerminal],        
  [FechaCancelacion],        
  [CodigoVendedor],        
  [TipoCambio],        
  [NroPedido],        
  [NroOrdenCompra],        
  [NroCotizacion],        
  [NroOrdenFabricacion],        
  [NroGuiasRemision],        
  [FechaVencimiento]        
 )        
 VALUES        
 (        
  @pov_NroComprobante,        
  @pid_FechaEmision,        
  @piv_CodigoPersona,        
  @pii_CodigoCondicionPago,        
  @pis_CodigoMoneda,        
  @pin_MontoTotal,        
  @pin_SubMonto,        
  @pin_MontoIGV,        
  @pin_MontoDescuento,        
  @pib_FlagIGV,        
  @pib_FlagImpresion,        
  @pis_CodigoEstado,        
  @piv_UsuarioRegistro,        
  GETDATE(),        
  @piv_UsuarioModificacion,        
  @pid_FechaModificacion,        
  @pov_CodigoDocumento,        
  @pib_FlagExtorno,        
  @pov_CodigoTerminal,        
  @pid_FechaCancelacion,        
  @piv_CodigoVendedor,        
  @pin_TipoCambio,        
  @piv_NroPedido,        
  @piv_NroOrdenCompra,        
  @piv_NroCotizacion,        
  @piv_NroOrdenFabricacion,        
  @piv_NroGuiasRemision,        
  @pid_FechaVencimiento        
 )        

Hasta esta linea tenemos una inserción común como podemos apreciar, en adelante veremos como lograr capturar el xml para recorrerlo y insertar cada fila que contenga.


/*          
1er Paso Declaramos algunas variables que necesitaremos mas adelante las dos principales son:        
 */  

 DECLARE @ld_FechaNula datetime            
 DECLARE @lv_FechaNula char(10) = '01/01/1900'          
 DECLARE @li_hdocDetFacturaVenta INT  -- Variable Entera que nos solicitara la función que utilizaremos           
 Declare @li_Contador int --  Variable Enterea que nos servirá para acumular el contador de filas       
     
  set @ld_FechaNula = CONVERT(datetime,@lv_FechaNula,103)          

  /*          
 2do Paso declararemos una variable tabla que almacenara la información que recuperaremos del xml, considerar siempre como campo inicial [Indice] [smallint] identity(1,1) NOT NULL el cual nos dara una identificación única de cada fila que recuperemos       
 */    
 DECLARE @lt_DetFactura TABLE          
 (          
  [Indice] [smallint] identity(1,1) NOT NULL,        
  [Item] [smallint] Not Null,      
  [NroGuiaRemision] [varchar] (15) NOT NULL,          
  [CodigoFamilia] [char](3) NOT NULL,          
  [CodigoSubFamilia] [char](3)NOT NULL,          
  [CodigoGrupo] [char](3) NOT NULL,          
  [CodigoProducto] [varchar](20) NOT NULL,         
  [CodigoProductoCliente] [varchar](20) NOT NULL,          
  [InafectoIgv] [bit] NOT NULL,         
  [AfectoPercepcion] [bit] NOT NULL,            
  [CodigoUnidadMedida] [smallint] NOT NULL,          
  [Cantidad] [decimal](20, 4) NOT NULL,          
  [Precio] [decimal](20, 4) NOT NULL,          
  [Importe] [decimal](20, 4) NOT NULL,          
  [CodigoEstado] [smallint] not null,          
  PRIMARY KEY ([Indice])          
 )           
 /*          
 3do Paso Necesitaremos la función sp_xml_preparedocument
@li_hdocDetFacturaVenta = devolverá un identificador para utilizarlo luego 
@piv_XMLEntity = Contiene la estructura XML
 */    
 EXEC sp_xml_preparedocument @li_hdocDetFacturaVenta OUTPUT, @piv_XMLEntity         
   /*          
 4do Paso Prepararemos la inserción del xml a nuestra variable tabla veamos
 */      
 INSERT INTO @lt_DetFactura        
 (               
  [Item],          
  [NroGuiaRemision],
  [CodigoFamilia],          
  [CodigoSubFamilia],          
  [CodigoGrupo],          
  [CodigoProducto],          
  [CodigoProductoCliente],    
  [InafectoIgv],          
  [AfectoPercepcion],            
  [CodigoUnidadMedida],          
  [Cantidad],          
  [Precio],          
  [Importe],                 
  [CodigoEstado]         

  ) 

      SELECT
      [FV_Item],          
      [FV_NroGuiaRemision],
      [FV_CodigoFamilia],          
      [FV_CodigoSubFamilia],          
      [FV_CodigoGrupo],          
      [FV_CodigoProducto],    
      [FV_CodigoProductoCliente],          
      [FV_InafectoIgv],          
      [FV_AfectoPercepcion],            
      [FV_CodigoUnidadMedida],          
      [FV_Cantidad],          
      [FV_Precio],          
      [FV_Importe],          
      [FV_CodigoEstado]    
                
  FROM OPENXML (@li_hdocDetFacturaVenta, N'/Root/Detalle',2)          
  WITH (           
    [FV_Item] [smallint] 'Item',  
    [FV_NroGuiaRemision] [varchar](10)  'NroGuiaRemision',      
    [FV_CodigoFamilia] [char](3) 'CodigoFamilia',          
    [FV_CodigoSubFamilia] [char](3) 'CodigoSubFamilia',          
    [FV_CodigoGrupo] [char](3) 'CodigoGrupo',          
    [FV_CodigoProducto] [varchar](20) 'CodigoProducto',          
    [FV_CodigoProductoCliente] [varchar](20) 'CodigoProductoCliente',       
    [FV_InafectoIgv] [bit] 'InafectoIgv',          
    [FV_AfectoPercepcion] [bit] 'AfectoPercepcion',            
    [FV_CodigoUnidadMedida] [smallint] 'CodigoUnidadMedida',          
    [FV_Cantidad] [decimal](20, 4) 'Cantidad',          
    [FV_Precio] [decimal](20, 4) 'Precio',          
    [FV_Importe] [decimal](20, 4) 'Importe',          
    [FV_CodigoEstado] [smallint] 'CodigoEstado'         
     )                       
          
      SET @li_Contador=1      
          
                   
        WHILE EXISTS(SELECT Item FROM @lt_DetFactura WHERE Indice = @li_Contador)          
 BEGIN          
 DECLARE @lv_CodigoTerminal char(5),    
 @lv_CodigoDocumento char(3),    
     @lv_NroComprobante varchar(15),    
         @lv_CodigoFamilia char(3),    
 @lv_CodigoSubFamilia char(3),    
 @lv_CodigoGrupo char(3),    
 @ls_NroItem smallint,    
 @ls_Item smallint,    
 @lv_CodigoProducto varchar(20),    
 @lv_CodigoProductoCliente varchar(20),    
 @ls_CodigoUnidadMedida smallint,    
 @ln_Cantidad decimal(20,4),    
 @ln_Precio decimal(20,4),    
 @ln_MontoIgv decimal(20,4)=0.00,    
 @ln_Descuento decimal(20,4)=0.00,    
 @ln_Importe decimal(20,4)=0.00,    
     @lv_Serie varchar(20)=' ',    
 @lv_Lote varchar(20)=' ',     
 @lv_NroGuiaRemision varchar(20),    
 @lb_FlagAfectoIGV bit=0,    
 @lb_FlagExtorno bit=0,    
 @lv_UsuarioRegistro char(10),    
 @ld_FechaRegistro datetime,    
 @lv_UsuarioModificacion char(10)=' ',    
 @ld_FechaModificacion datetime = @ld_FechaNula,    
 @lv_NumeroPedido varchar(20)=' ',    
 @lv_NumeroCotizacion varchar(20)=' ' ,    
 @lv_OrdenProduccion varchar(20)=' ',    
     @ls_CodigoEstado smallint=0    
      
          
       
    SELECT @ls_Item = Item,    
@lv_CodigoProductoCliente=CodigoProductoCliente,
        @lv_NroGuiaRemision = NroGuiaRemision,    
        @lv_CodigoFamilia = CodigoFamilia,    
        @lv_CodigoSubFamilia = CodigoSubFamilia,    
        @lv_CodigoGrupo = CodigoGrupo,    
        @lv_CodigoProducto = CodigoProducto,    
        @ls_CodigoUnidadMedida = CodigoUnidadMedida,    
        @ln_Cantidad= Cantidad,    
        @ln_Precio = Precio,    
        @ln_Importe = Importe,    
        @ls_CodigoEstado = CodigoEstado    
       FROM @lt_DetFactura    
       WHERE Item = @li_Contador    
           
           
       EXECUTE [JSDHTSC].[dbo].[usp_ins_DetalleComprobante]     
          @pov_CodigoTerminal    
         ,@pov_CodigoDocumento    
         ,@pov_NroComprobante    
         ,@lv_CodigoFamilia    
         ,@lv_CodigoSubFamilia    
         ,@lv_CodigoGrupo    
         ,@ls_Item    
         ,@lv_CodigoProducto    
         ,@lv_CodigoProductoCliente    
         ,@ls_CodigoUnidadMedida    
         ,@ln_Cantidad    
         ,@ln_Precio    
         ,@ln_MontoIgv    
         ,@ln_Descuento    
         ,@lv_Serie    
         ,@lv_Lote    
         ,@lv_NroGuiaRemision    
         ,@lb_FlagAfectoIGV    
         ,@lb_FlagExtorno    
         ,@piv_UsuarioRegistro    
         ,@ld_FechaActual    
         ,@lv_UsuarioModificacion    
         ,@ld_FechaModificacion    
         ,@lv_NumeroPedido    
         ,@lv_NumeroCotizacion    
         ,@lv_OrdenProduccion    
    
    
   set @li_Contador = @li_Contador + 1    
  END         
         
END