All posts by John Harold Belalcazar Lozano

Software Developer Engineer, since 1995. Husband and father of 2 girls. Learning everyday.

The lack in some software engineering glossary of terms and graphical representations.


Software Engineering is one of the most important careers today. Almost every aspect in our life is now surrounded by devices using software. Having said that, why this profession is lack on having their own terms in some of the main aspects.

For example:

manos-arquitecto-dibujante

Software Architecture, why architecture? Do you know what architecture means?

Architecture is the art and technique of designing, designing and constructing buildings, modifying human habitat and studying, aesthetics, good use and function of spaces, whether architectural or urban.  

For sure there must be a better term to define it in software:

It’s the fundamental structures of a software system and the discipline of creating such structures and systems. Each structure comprises software elements, relations among them, and properties of both elements and relations.

What about this one:

evangelist

Software Evangelist? really?

Evangelism is the commitment to or act of publicly preaching (ministry) of the Gospel with the intention of spreading the message and teachings of Jesus Christ.

In software, there must be a better word for:

The person who builds a critical mass of support for a given technology, and then establishes it as a technical standard in a market that is subject to network effects.

This lack in terms applies too in graphical icons widely used.

puzzlepiñones

For example, have you seen a lot of times the rotating sprockets or puzzles to define “integration”?

Or what about the wrench to define “utilities”.

wrench

 

We really need to establish better own terms and icons to really evolve our software engineering profession. Not the cloning way, real professional new words and graphics.

 

*Some terms extracted from wikipedia.

Advertisements

Advertencia: Establezca la propiedad AutoGenerateBindingRedirects en true en el archivo del proyecto. Visual Studio.


Mensaje de error completo:

Se encontraron conflictos entre diferentes versiones del mismo ensamblado dependiente. Establezca la propiedad “AutoGenerateBindingRedirects” en true en el archivo del proyecto. Para obtener más información, consulte http://go.microsoft.com/fwlink/?LinkId=294190.

Para eliminar esta advertencia:

Ir al menú Proyecto, Propiedades. Aparece la ventana con todas las propiedades, escoger el apartado “Aplicación” y se da clic en el check “Generar redirecciones de enlace automáticamente”

AutogenerateBindingRedirects
Para eliminar la advertencia

Como monitorear ejecución de triggers en SQL SERVER Profiler / monitor trigger execution


Normalmente por defecto el Sql Server profiler no muestra los resultados en las ejecuciones de triggers, por eso debemos activar esta función, ir a “Events Selection”, Click en “Show all events”, luego buscar “Stored Procedures” y allí marcar los eventos: “SP:StmtCompleted” y “SP:StmtStarting”

monitor trigger

Lista de eventos a seleccionar para monitorear triggers

Ahora ya se pueden visualizar los resultados de ejecución de triggers:

trigger monitor result
En este momento en la ventana de resultados se ve la ejecución del trigger

Normally by default Sql Server profiler is not showing triggers execution, we must activate the option, so, go to “Events Selection”, Click “Show all events”, search “Stored Procedures” select events: “SP:StmtCompleted” y “SP:StmtStarting”

After this you can now watch the trigger execution.

Hey Cortana shut down my computer / Hola Cortana apaga mi computador


It’s now possible to shut down your pc by telling Cortana do that for you. You just need to confirm by a “Yes” and it will be turned off. I searched on internet and it seems at least 2 years ago this is working. But I just discovered today. This kind of vocal commands let people feel near to a more AI powered computer. Update 09/07/2019 I tried to use this feature changing the language in my computer to Spanish, but with no luck. In spanish this is not working yet.

Ahora es posible apagar tu pc diciéndole a Cortana que lo haga. Solo necesitas confirmar con un “Sí” y se apagará. He buscado en internet y parece que hace ya 2 años esto está funcionando, pero lo he descubierto hoy. Esta clase de comandos vocales hacen sentir a las personas un poco más cerca de computadores manejados con IA. Actualización 09/07/2019 He cambiado el idioma de mi computador a Españo y en español no funciona esta característica todavía.

shutdown

Hacer Ciclos o iteraciones en SQL Server / How to make cycles or iterate in SQL Server


Iteración-2

Algunas veces necesitamos en un store procedure recorrer un conjunto de resultados, vamos a usar tablas temporales para este ejemplo. / Sometimes we need to iterate over a resultset, let’s use some temporary tables in this example:

create table #tmpartic(codigo varchar(10), nombre varchar(50), price int)
insert into #tmpartic values('001', 'KEYBOARD / TECLADO', 70)
insert into #tmpartic values('002', 'MOUSE / RATON', 90)
insert into #tmpartic values('003', 'PEN / LAPICERO', 45)
insert into #tmpartic values('004', 'DISPLAY / MONITOR', 150)
insert into #tmpartic values('005', 'HARD DISK / DISCO DURO', 200)

create table #tmpcli(client varchar(10), City varchar(30), limit int)
insert into #tmpartic values('5551010', 'Bogota', 100)
insert into #tmpartic values('5156225', 'Bangladesh', 300)
insert into #tmpartic values('6859852', 'Pekin', 500)
insert into #tmpartic values('7851215', 'Tokio', 500)
insert into #tmpartic values('8989822', 'Sidney', 350)

create table #tmpped(client varchar(10), article varchar(10), price int)

Ahora necesitamos crear registros en la tabla tmpcli para cada cliente todos los artículos mientras no se pase de su límite. /

Now we need to create records in tmpcli table for each client every article without being over limit.

Para esto creamos 2 tablas temporales #tmpartic con cada artículo y su precio y #tmpcli con cada cliente y su límite. El ciclo principal es sobre la tabla temporal de clientes entonces obtenemos su límite y mientras tenga límite disponible agregamos un registro en la tabla #tmpped, por cada registro agregado vamos disminuyendo el precio del artículo para que no se vaya a pasar. El ciclo while se controla mediante la columna kctrl que empieza en null y tras cada iteración cambia a 1 así ya no se procesa más. Para los artículos se debe volver a actualizar en null cuando se cambia de cliente para garantizar que se procesan de nuevo todos los artículos para cada cliente. /

For this we create 2 temporary tables #tmpartic with each article and price y #tmpcli for each client and limit. Main cycle runs on clients temporary table, we read his limit and while limit is available we add a new record in #tmpped, for each record added we subtract the price of the article preventing to add more than expected. The cycle is controled with the column kctrl that starts in null and after every iteration it changes to 1 that way is no longer used. For the articles this column must be updated to null when client is changed to warranty all the articles are processed for each client.

DECLARE @nLIMIT int, @nRECNUM int, @cCLI varchar(10);
DECLARE @nRECNP int, @cART varchar(10), @nPRIC int;
SELECT null kctrl, codigo, price, ROW_NUMBER() OVER(ORDER BY codigo) as recnum into #selpro FROM #tmpartic;
SELECT null kctrl, client, limit, ROW_NUMBER() OVER(ORDER BY limit) as recnum into #selcli FROM #tmpcli;
WHILE (SELECT count(*) FROM #selcli WHERE isnull(kctrl, 0) = 0) > 0
BEGIN
  SET @nRECNUM=(SELECT MIN(recnum) FROM #selcli WHERE ISNULL(kctrl, 0) = 0)
  SELECT @nLIMIT=limit, @cCLI=client FROM #selcli WHERE recnum=@nRECNUM
  UPDATE #selpro SET kctrl=null
  WHILE (SELECT count(*) FROM #selpro WHERE isnull(kctrl, 0) = 0) > 0
    BEGIN
      SET @nRECNP=(SELECT MIN(recnum) FROM #selpro WHERE ISNULL(kctrl, 0) = 0)
      SELECT @cART=codigo, @nPRIC=price FROM #selpro WHERE recnum=@nRECNP
      IF @nLIMIT>=@nPRIC
        BEGIN
          INSERT INTO #tmpped(client, article, price) VALUES(@cCLI, @cART,@nPRIC)
          SET @nLIMIT=@nLIMIT-@nPRIC
        END
      ELSE BREAK
      UPDATE #selpro SET kctrl=1 WHERE recnum=@nRECNP
  END
  UPDATE #selcli SET kctrl=1 WHERE recnum=@nRECNUM
END

Ahora vamos a validar / let’s now validate:
SELECT * from #selcli

clientes

SELECT * from #selpro
articles

SELECT * from #tmpped
peds

Verificación de resultados / Verification of results

Client $Limit $Total Peds ok?
5551010 100 70 Yes
5156225 300 205 Yes
8989822 350 205 Yes
6859852 500 355 Yes
7851215 500 355 Yes

Ahora usted podría cambiar los límites en los clientes y reiniciar el proceso para validar contra diferentes valores /

Now you can change the limits in client and restart the process to verify against different values.

Para borrar todas las tablas / to delete all the tables:

DROP TABLE #tmpartic
DROP TABLE #tmpcli
DROP TABLE #tmpped
DROP TABLE #selpro
DROP TABLE #selcli

Preguntas? / Questions?

Seleccionar registros de una tabla y todos sus registros relacionados. / Select records from a table and all related records.


Este es el comportamiento por defecto de un select sobre múltiples tablas relacionadas, nos devuelve un resultado completo incluyendo los registros de la tabla principal más todos los relacionados / This is the default behavior when performing queries against multiple related tables.

create table #tmpartic(codigo varchar(10), nombre varchar(50))
insert into #tmpartic values('001', 'KEYBOARD / TECLADO')
insert into #tmpartic values('002', 'MOUSE / RATON')
insert into #tmpartic values('003', 'PEN / LAPICERO')
insert into #tmpartic values('004', 'DISPLAY / MONITOR')
insert into #tmpartic values('005', 'HARD DISK / DISCO DURO')

create table #tmpbars(article varchar(10), codbar varchar(20))
insert into #tmpbars values('001', '8909001212')
insert into #tmpbars values('001', '8909001213')
insert into #tmpbars values('001', '8909001214')
insert into #tmpbars values('003', '8909051223')
insert into #tmpbars values('004', '8909061245')
insert into #tmpbars values('005', '8909071241')
insert into #tmpbars values('005', '8909071242')

create table #tmpprov(article varchar(10), proveed varchar(10))
insert into #tmpprov values('001', '101010')
insert into #tmpprov values('001', '102010')
insert into #tmpprov values('001', '103010')
insert into #tmpprov values('002', '102010')
insert into #tmpprov values('003', '103010')
insert into #tmpprov values('004', '101010')
insert into #tmpprov values('004', '102010')
insert into #tmpprov values('004', '104020')
insert into #tmpprov values('005', '104030')

Ahora vamos a seleccionar con un left normal / select with a normal “left” query :

select art.codigo, art.nombre, isnull(bar.codbar,'') as codbar, isnull(pro.proveed,'') as proveed
from #tmpartic art
left join #tmpbars bar on art.codigo=bar.article
left join #tmpprov pro on art.codigo=pro.article

Esto nos retorna todos los registros repetidos artículos en barras y en proveed, se puede ver el artículo 001 que se repite 9 veces / this is returning 9 repeated records of the article 001:

todoslosregistros
Record with all related records

Otra forma de conseguir el mismo resultado:

select art.codigo, art.nombre, isnull(bar.codbar,'') as codbar, isnull(pro.proveed,'') as proveed
from #tmpartic art
outer apply (select * from #tmpbars where art.codigo=article ) bar
outer apply (select * from #tmpprov where art.codigo=article ) pro

Y finalmente, esto para motivos solo de verificación de velocidad o solo por diversión, un select que devuelve una combinación completa de todos los registros. /And finally just to check execution performance or just for fun, a query that returns a complete combination of all records:


select art.codigo, art.nombre, bar.codbar, pro.proveed
from #tmpartic art, #tmpbars bar, #tmpprov pro

exponentialrecords
Exponential

seleccionar registro de una tabla y 1 solo registro relacionado / select records from a table and only 1 related record.


Por ejemplo que tenemos una tabla de artículos y una tabla de códigos de barra relacionados con dicho artículo y necesitamos por cada artículo 1 solo código de barra porque con esto sabremos si tiene barra o no y no requerimos todos los códigos de barra.  / For example we have an articles table and barcodes table, we need for each article show just 1 barcode that will show that the article has barcode no matter how many.

Estas serían las tablas / example tables:


create table #tmpartic(codigo varchar(10), nombre varchar(50))
insert into #tmpartic values('001', 'KEYBOARD / TECLADO')
insert into #tmpartic values('002', 'MOUSE / RATON')
insert into #tmpartic values('003', 'PEN / LAPICERO')
insert into #tmpartic values('004', 'DISPLAY / MONITOR')
insert into #tmpartic values('005', 'HARD DISK / DISCO DURO')


create table #tmpbars(article varchar(10), codbar varchar(20))
insert into #tmpbars values('001', '8909001212')
insert into #tmpbars values('001', '8909001213')
insert into #tmpbars values('001', '8909001214')
insert into #tmpbars values('003', '8909051223')
insert into #tmpbars values('004', '8909061245')
insert into #tmpbars values('005', '8909071241')

Ahora vamos a seleccionar con un left normal / select with a normal “left” query :

select art.codigo, art.nombre, isnull(bar.codbar,'') as codbar from #tmpartic art left join #tmpbars bar on art.codigo=bar.article

Esto nos retorna todos los registros repetidos artículos en barras, se puede ver el artículo 001 que se repite 3 veces / this is returning 3 repeated records of the article 001:

repetidos

Ahora veamos la magia, vamos a usar la instrucción que nos retornará solo 1 registro relacionado / Now let’s watch the magic, with this instruction we will have only 1 related record:

select art.codigo, art.nombre, isnull(bar.codbar,'') as codbar from #tmpartic art outer apply(select top 1 article, codbar from #tmpbars where article=art.codigo) bar

Resultado, no se repiten los registros de barras y sale solo 1 barra / This is the result, just 1 barcode for each article:

repetidos_no

Podemos usar este sql cuando necesitamos filtrar repetidos desde la misma ejecución de la sentencia SQL. / We can use this sql when we need to filter repeated records since the start of the Sql sentence.