
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [dbo].[p_sys_md_csharp_generate_tables_and_rows] 
AS
BEGIN
	SET NOCOUNT ON;
	
	DECLARE @tabs_indent int	-- nombre de caractères TABULATION utilisés pour l'indentation du code généré dans les fonctions
	
	set @tabs_indent = 5
	
	declare @tbl IdTextTableType --TABLE(const varchar(2000))
	

	/*
	DGE - les classes Row* et Table* sont générées dans le fichiers DBC.cs
	print 'using System;'
	print 'using System.Data;'
	print char(13) + char(10)
	
	print 'namespace Ais.Data'
	print '{'
	print char(13) + char(10)
	*/


	print char(9) + '// ce code est généré par la procédure stockée [p_sys_md_csharp_generate_tables_and_rows]'
	print char(13) + char(10)
	
	
	declare @table_name				ais_name,			-- nom de la table, de forme my_table
			@class_table_name		ais_name,			-- nom de la classe de type table, de forme TableMyTable
			@class_row_name			ais_name,			-- nom de la classe de type record, de forme RowMyTable
			@capitalized_name		ais_name,			-- variable de travail, MyTable
			@field_name				ais_name,			-- nom du champ, de forme my_field
			@field_label			nvarchar(64),		-- libellé 1 de md_fields
			@field_type_c			ais_name,			-- type c# du champ (table md_fields)
			@field_type_c_nullable	ais_name,			-- type c# nullable du champ (int?, short? etc. Pour string il n'y a pas de string?)
			@field_type				ais_name,			-- type SQL du champ (table md_fields)
			@field_size				smallint,			-- taille du champ
			@field_nullable			bit,				-- champ nullable oui/non
			@c_function				ais_name,			-- nom de la fonction c# (ValueInt, ValueShort, ValueString etc) 
			@c_fonction_value		ais_name,			-- nom de la fonction c# (
			@param_name				ais_name,			-- nom du paramètre correspondant à un champ
			@param_type				ais_name,			-- type du paramètre correspondant à un champ (ex: int pour un champ obligatoire, int? pour un champ nullable)
			@property_name			ais_name,			-- nom de la propriété correspondant à un champ
			@add_params				varchar(max),		-- liste de paramètres de la fonction Add de la classe de type Table
			@init_fields			varchar(max)		-- séquence d'initialisation des champs
			
	
	declare c_tables insensitive cursor 
	for
		select	distinct tbl_table_name 
		from	md_tables t
				inner join md_tables_orm o on o.tblo_table_name = t.tbl_table_name
		where	tbl_virtual = 0
		order by tbl_table_name
		
	open c_tables
	
	fetch next from c_tables into @table_name
	
	while @@FETCH_STATUS = 0 
	begin
		
		select	@capitalized_name = dbo.f_capitalize(@table_name),
				@class_table_name = 'Table' + @capitalized_name,
				@class_row_name = 'Row' + @capitalized_name,
				@add_params = replicate(char(9), @tabs_indent),
				@init_fields = replicate(char(9), @tabs_indent)
				
		-- générer la classe de type Row
		print char(13) + char(10)
		
		print char(9) + 'public partial class ' + @class_row_name
		print char(9) + '{'
		print char(9) + char(9) + 'public virtual DataRow Row {get;set;}'
		
		print char(13) + char(10)
		
		
        print char(9) + char(9) + '/// <summary>'
        print char(9) + char(9) + '/// Constructor'
        print char(9) + char(9) + '/// </summary>'
        print char(9) + char(9) + '/// <param name="row">Une variable de type DataRow - ' + @table_name + '</param>'
		print char(9) + char(9) + 'public ' + @class_row_name + '(DataRow row)'
		print char(9) + char(9) + '{' + char(9) + 'Row = row; }'

		print char(13) + char(10)

		-- ajouter un constructor sans paramètres
        print char(9) + char(9) + '/// <summary>'
        print char(9) + char(9) + '/// Constructor par défaut'
        print char(9) + char(9) + '/// </summary>'
		print char(9) + char(9) + 'public ' + @class_row_name + '() {}'

		
		print char(13) + char(10)
		
		declare c_fields insensitive cursor 
		for		
			select	fld_field_name, fld_l1, fld_type, fld_size, typ_c, fld_nullable
			from	md_fields 
					inner join md_types	on typ_type_name = fld_type
			where	fld_table_name = @table_name
			and		fld_virtual = 0
			and		typ_c is not null
			order by fld_ordinal_position 
		
		open c_fields
		
		fetch next from c_fields into @field_name, @field_label, @field_type, @field_size, @field_type_c, @field_nullable
		
		while @@FETCH_STATUS = 0 
		begin
		
			select	@param_name = dbo.f_camel_case(@field_name),
					@property_name = dbo.f_capitalize(@field_name),
					@field_type_c_nullable =	case	
												when @field_type_c = 'string' then @field_type_c 
												else @field_type_c + ' ?'
												end,
					@param_type =	case
									when @field_nullable != 0 then @field_type_c_nullable
									else @field_type_c
									end,
					@c_function =	'Value' + dbo.f_capitalize(@field_type_c),				-- byte -> ValueByte, bool ->ValueBool etc
					@c_fonction_value =	'AsNullable' + dbo.f_capitalize(@field_type_c), 	-- byte -> AsNullableByte, bool ->AsNullableBool etc			
					
					@add_params = @add_params + @param_type + ' ' + @param_name + ',' + CHAR(10) + replicate(char(9), 5),
					@init_fields = @init_fields + @property_name +	CASE 
																	when @field_nullable = 0 then ''
																	else 'AsNullable'
																	end +
										' = ' + @param_name + ',' + CHAR(10) + replicate(char(9), 5)
					
			/*********************************************************************************************
			générer une propriété qui retourne une valeur NOT NULL
			*********************************************************************************************/
			
			-- générer summary pour chaque champ ( propriété get-set )
			print char(13) + char(10)
			print char(9) + char(9) + '/// <summary>'
			print char(9) + char(9) + '/// ' + UPPER(@field_name) + ' - ' + @field_label
			
			if @field_nullable = 0 
				print char(9) + char(9) + '/// ' + @field_type + '(' + convert(varchar, @field_size) + ') NOT NULL'
			else 
				print char(9) + char(9) + '/// ' + @field_type + '(' + convert(varchar, @field_size) + ') NULL'
				
			print char(9) + char(9) + '/// </summary>'
			
		
			-- générer une propriété get-set pour chaque champ qui retourne une valeur NOT NULL
			print char(9) + char(9) + 'public virtual ' + @field_type_c + ' ' + @property_name
			print char(9) + char(9) + '{'
			print char(9) + char(9) + char(9) + 'set { Row[DBC.' + upper(@field_name) + ']= value;}'
			print char(9) + char(9) + char(9) + 'get { return Row.' + @c_function + '(DBC.' + upper(@field_name) + '); }'
			print char(9) + char(9) + '}'	


			
			
			/*********************************************************************************************
			générer une propriété qui retourne une valeur NULL, pour les champs NULLABLES uniquement
			*********************************************************************************************/			
			if @field_nullable != 0
			begin
				print char(9) + char(9) + 'public virtual ' + @field_type_c_nullable + ' ' + dbo.f_capitalize(@field_name) + 'AsNullable'
				print char(9) + char(9) + '{'
				print char(9) + char(9) + char(9) + 'set'
				print char(9) + char(9) + char(9) + '{'
				print char(9) + char(9) + char(9) + char(9) + 'if (value == null)'
				print char(9) + char(9) + char(9) + char(9) + char(9) + 'Row[DBC.' + upper(@field_name) + ']= DBNull.Value;'
				print char(9) + char(9) + char(9) + char(9) + 'else'
				print char(9) + char(9) + char(9) + char(9) + char(9) + 'Row[DBC.' + upper(@field_name) + ']= value;'
				print char(9) + char(9) + char(9) + '}'
				print char(9) + char(9) + char(9) + 'get { return Row.' + @c_fonction_value + '(DBC.' + upper(@field_name) + '); }'
				print char(9) + char(9) + '}'	
			end


			/*********************************************************************************************
			générer les propriétés lx
			*********************************************************************************************/

			if RIGHT(@field_name, 2) = 'l1'
			begin
				select @field_name = left(@field_name, len(@field_name) - 1) + 'x', 
					@property_name= left(@property_name, len(@property_name) - 1) + 'x'

				print char(9) + char(9) + 'public virtual ' + @field_type_c + ' ' + @property_name
				print char(9) + char(9) + '{'
				print char(9) + char(9) + char(9) + 'set { Row[DBC.' + upper(@field_name) + ']= value; }'
				print char(9) + char(9) + char(9) + 'get { return Row.' + @c_function + '(DBC.' + upper(@field_name) + ');}'
				print char(9) + char(9) + '}'	

			end
		
			fetch next from c_fields into @field_name, @field_label, @field_type, @field_size, @field_type_c, @field_nullable
		end
		
		print char(9) + '}'		
		
		close c_fields
		deallocate c_fields
		
		select	@add_params = left(@add_params, len(@add_params) - @tabs_indent - 2),
				@init_fields = left(@init_fields, len(@init_fields) - @tabs_indent - 2)
				
				
		-- générer la classe de type Table
		print char(13) + char(10)
		print char(9) + 'public partial class ' + @class_table_name
		print char(9) + '{'
		print char(9) + char(9) + 'public DataTable Table {get;set;}'
		print char(13) + char(10)
		print char(9) + char(9) + '/// <summary>'
		print char(9) + char(9) + '/// Constructor'
		print char(9) + char(9) + '/// </summary>'
		print char(9) + char(9) + '/// <param name="table">Une variable de type DataTable - ' + @table_name + '</param>'
		print char(9) + char(9) + 'public ' + @class_table_name + '(DataTable table)'
		print char(9) + char(9) + '{'

		print char(9) + char(9) + char(9) + 'if (table == null) table = DBC.GetTableTypeInstance(DBC.' + upper(@table_name) + ');'
		print char(9) + char(9) + char(9) + 'if (!table.TableName.Equals(DBC.' + upper(@table_name) + '))'
		print char(9) + char(9) + char(9) + char(9) + 'throw new AisException(AisDataErrorTypesEnum.TECHNICAL, string.Empty, string.Format("Wrong table parameter : {0} !", DBC.' + upper(@table_name) + '));'
		
		print char(13) + char(10)
		print char(9) + char(9) + char(9) + 'Table = table;'
		print char(9) + char(9) + '}'

		-- constructor sans paramètres
		print char(13) + char(10)
		print char(9) + char(9) + '/// <summary>'
		print char(9) + char(9) + '/// Constructor par défaut'
		print char(9) + char(9) + '/// </summary>'
		print char(9) + char(9) + 'public ' + @class_table_name + '() {}'
		
		print char(13) + char(10)
		print char(9) + char(9) + 'public ' + @class_row_name + ' Add(' 
		print @add_params + ')'
		print char(9) + char(9) + '{'
		--print char(9) + char(9) + char(9) + 'return new ' + @class_row_name + '(Table.AddEmptyRow())'
		print char(9) + char(9) + char(9) + 'var nr = Table.NewRow();'
		print char(9) + char(9) + char(9) + 'var newRow = new ' + @class_row_name + '(nr)'
		print char(9) + char(9) + char(9) + '{'
		print @init_fields
		print char(9) + char(9) + char(9) + '};'
		print char(9) + char(9) + char(9) + 'nr.SetAisDefaultValuesIfNull();'
		print char(9) + char(9) + char(9) + 'Table.Rows.Add(nr);'
		print char(9) + char(9) + char(9) + 'return newRow;'
		print char(9) + char(9) + '}'
		print char(9) + '}'

		print char(13) + char(10)
		
		fetch next from c_tables into @table_name
	end 
	
	close c_tables
	deallocate c_tables
		
	/*
	DGE - les classes Row* et Table* sont générées dans le fichiers DBC.cs
	print '}'
	*/
	
END












GO
