<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2519420594990276388</id><updated>2025-12-19T08:26:16.258-08:00</updated><category term="saleslogix"/><category term="7.5.3"/><category term="ASP"/><category term="IIS"/><category term="c#"/><category term="7.5"/><category term="Currency"/><category term="Lookup"/><category term="moneda"/><category term="reports"/><category term="size"/><category term="web"/><category term="wrong"/><category term="11"/><category term="2011 r1"/><category term="64 bits"/><category term="8"/><category term="AddDays"/><category term="CrystalReports"/><category term="DateTime"/><category term="FOR UPDATE"/><category term="FOR UPDATE OF"/><category term="InforCRM"/><category term="Instalar"/><category term="Install"/><category term="Knowledge Sync"/><category term="Linux"/><category term="Metabase"/><category term="NOWAIT"/><category term="Oracle"/><category term="Proceso de ventas"/><category term="R2"/><category term="SELECT FOR UPDATE"/><category term="SKIP LOCKED"/><category term="SLX"/><category term="Sales Process"/><category term="Send"/><category term="Stored Procedure"/><category term="Thunderbird"/><category term="Windows 2008"/><category term="aci"/><category term="agrandar"/><category term="area-category-issue"/><category term="auto"/><category term="bb"/><category term="blackberry"/><category term="bloquear campo"/><category term="bloquear registro"/><category term="bloquear tabla"/><category term="busqueda"/><category term="campos por nombre"/><category term="cerrar"/><category term="clear"/><category term="client"/><category term="crm"/><category term="crystal"/><category term="database"/><category term="date"/><category term="datos"/><category term="dependant"/><category term="dependiente"/><category term="dias"/><category term="distribución"/><category term="domingo"/><category term="entity"/><category term="error"/><category term="exe"/><category term="expand"/><category term="expandir"/><category term="fecha"/><category term="fechahora"/><category term="fields by name"/><category term="font"/><category term="form"/><category term="format"/><category term="formato"/><category term="formulario"/><category term="fuente"/><category term="grow"/><category term="herramienta"/><category term="inactivity"/><category term="inaport"/><category term="incorrecta"/><category term="incorrecto"/><category term="insert"/><category term="insertar"/><category term="laborales"/><category term="localización"/><category term="localization"/><category term="logoff"/><category term="logout"/><category term="lost"/><category term="mobil"/><category term="net"/><category term="nombre"/><category term="null"/><category term="os 5"/><category term="os5"/><category term="parameter"/><category term="parametro"/><category term="pierde"/><category term="por programación"/><category term="procesamiento de datos"/><category term="programatically"/><category term="reportes"/><category term="reportname"/><category term="sabado"/><category term="saturday"/><category term="scribe"/><category term="server"/><category term="sp"/><category term="storedprocedure"/><category term="sumar"/><category term="sunday"/><category term="tamaño"/><category term="tool"/><category term="valor"/><category term="value"/><category term="vb"/><category term="workdays"/><category term="xii"/><title type='text'>José Ureña</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-8705980242281712308</id><published>2018-04-21T09:26:00.001-07:00</published><updated>2018-04-21T09:26:21.743-07:00</updated><title type='text'>Error con archivos TypeScript (TS) al abrir portal de InforCRM en Visual Studio</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Si al abrir un portal de InforCRM en Visual Studio aparece un error de que no encuentra módulos de Type Script o relacionados a archivos TS, la solución es entrar en el administrador de paquetes de NuGet y agregar el &quot;Microsoft.TypeScript.Compiler&quot;.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/8705980242281712308/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2018/04/error-con-archivos-typescript-ts-al.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/8705980242281712308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/8705980242281712308'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2018/04/error-con-archivos-typescript-ts-al.html' title='Error con archivos TypeScript (TS) al abrir portal de InforCRM en Visual Studio'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-3141513520290704068</id><published>2015-09-12T20:59:00.001-07:00</published><updated>2015-09-12T20:59:07.754-07:00</updated><title type='text'>Autogenerando aplicaciones de Codeigniter con AppLighter</title><content type='html'>&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;270&quot; src=&quot;https://www.youtube.com/embed/OXQ2-zKCjk0&quot; width=&quot;480&quot;&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/3141513520290704068/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2015/09/autogenerando-aplicaciones-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/3141513520290704068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/3141513520290704068'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2015/09/autogenerando-aplicaciones-de.html' title='Autogenerando aplicaciones de Codeigniter con AppLighter'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/OXQ2-zKCjk0/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-5471300084073077482</id><published>2014-11-27T10:30:00.000-08:00</published><updated>2014-11-27T10:30:31.321-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="InforCRM"/><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="saleslogix"/><category scheme="http://www.blogger.com/atom/ns#" term="Send"/><category scheme="http://www.blogger.com/atom/ns#" term="SLX"/><category scheme="http://www.blogger.com/atom/ns#" term="Thunderbird"/><title type='text'>Send 2 SLX en Thunderbird, desde Linux!</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Siempre he sentido que para Linux hay muy poco soporte con SalesLogix, por lo que decidí crear mi propia funcionalidad de &quot;Send2SLX&quot; para Thunderbird.&lt;br /&gt;
&lt;br /&gt;
Para usar este &quot;Add-on&quot; es necesario tener el portal de SData funcionando. &lt;br /&gt;
&lt;br /&gt;
Aquí hay un video de cómo funciona y cómo se configura:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe allowfullscreen=&#39;allowfullscreen&#39; webkitallowfullscreen=&#39;webkitallowfullscreen&#39; mozallowfullscreen=&#39;mozallowfullscreen&#39; width=&#39;320&#39; height=&#39;266&#39; src=&#39;https://www.youtube.com/embed/PRpINgOHeVc?feature=player_embedded&#39; frameborder=&#39;0&#39;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
Este es el &quot;Add-on&quot; si lo desean probar:&amp;nbsp; &lt;a href=&quot;https://www.dropbox.com/s/nlw4ikac3pj9v8c/thunderbar-1.0.0-tb.xpi?dl=0&quot; target=&quot;_blank&quot;&gt;ThunderBAR v1.0.0 by Scorpile&lt;/a&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/5471300084073077482/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2014/11/send-2-slx-en-thunderbird-desde-linux.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/5471300084073077482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/5471300084073077482'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2014/11/send-2-slx-en-thunderbird-desde-linux.html' title='Send 2 SLX en Thunderbird, desde Linux!'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-960772947932113586</id><published>2014-10-10T13:29:00.002-07:00</published><updated>2014-10-10T13:33:10.214-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CrystalReports"/><category scheme="http://www.blogger.com/atom/ns#" term="date"/><category scheme="http://www.blogger.com/atom/ns#" term="DateTime"/><category scheme="http://www.blogger.com/atom/ns#" term="fecha"/><category scheme="http://www.blogger.com/atom/ns#" term="fechahora"/><category scheme="http://www.blogger.com/atom/ns#" term="parameter"/><category scheme="http://www.blogger.com/atom/ns#" term="parametro"/><category scheme="http://www.blogger.com/atom/ns#" term="sp"/><category scheme="http://www.blogger.com/atom/ns#" term="Stored Procedure"/><category scheme="http://www.blogger.com/atom/ns#" term="storedprocedure"/><title type='text'>CrystalReports y un Stored Procedure con parametro DateTime</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Los que hayan intentado correr desde Crystal Reports un Stored Procedure que utilice parámetros Date o DateTime, habrán notado que sale un error (&quot;CONVERT&quot; algo...).&lt;br /&gt;
&lt;br /&gt;
El tema es que Crystal siempre que reemplaza el parámetro le coloca CONVERT(DATETIME,&#39;2014-01-01 00:00:00&#39;,120) lo cual *NO* es válido en un Stored Procedure en MSSQL.&amp;nbsp; Por qué? porque en un SP no se pueden utilizar funciones en los parámetros.&lt;br /&gt;
&lt;br /&gt;
Afortunadamente hay un pequeño truco que pueden aplicar!&lt;br /&gt;
&lt;br /&gt;
Paso 1, cambiamos o creamos nuestro SP para que el parámetro sea VARCHAR(100).&amp;nbsp; Voy a colocar un SP de ejemplo para que se hagan a la idea de lo que pueden hacer:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3d85c6;&quot;&gt;CREATE PROCEDURE [sysdba].[MISPROC]&amp;nbsp;&amp;nbsp;&amp;nbsp; @fechaini VARCHAR(100) AS&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp;SET NOCOUNT ON;&lt;br /&gt;&amp;nbsp;CREATE TABLE #FECHAS(FI DATETIME)&lt;br /&gt;&amp;nbsp;DECLARE @qry NVARCHAR(200)&lt;br /&gt;&amp;nbsp;SET @qry = &#39;INSERT INTO #FECHAS (FI) VALUES (&#39; + @fechaini + &#39;)&#39;&lt;br /&gt;&amp;nbsp;EXEC (@qry )&lt;br /&gt;&amp;nbsp;SELECT FI FROM #FECHAS&lt;br /&gt;&amp;nbsp;DROP TABLE #FECHAS&lt;br /&gt;END&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Creo que ya deben ir notando el truco.&amp;nbsp; Sigamos.&lt;br /&gt;
&lt;br /&gt;
Paso 2, Creamos nuestro reporte en Crystal.&lt;br /&gt;
&lt;br /&gt;
Creamos la conexión (esto funciona usando el SalesLogix OLEDB Provider e incluso si es un reporte que usa el SQL Native Client) y seleccionamos &quot;Agregar comando&quot; (OJO! vamos a escribir, no confundan con seleccionar directamente el Stored Procedure de la lista que está abajo!) y escribimos el nombre de nuestro SP seguido del parámetro, pero el parámetro lo colocamos entre doble comillas (Si! dobles, no simples):&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3d85c6;&quot;&gt;MISPROC &quot;{?@fechaini}&quot;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
Inmediatamente, definimos el parámetro en la derecha.&amp;nbsp; En el nombre debe decir exactamente @fechaini (en el campo del query pusimos {?@fechaini}).&amp;nbsp; Además le colocamos tipo FechaHora (o Fecha).&lt;br /&gt;
&lt;br /&gt;
Ahora aceptan y Crystal debería pedirles una fecha por primera vez.&amp;nbsp; La colocan y al aceptar, en la lista de tablas debería aparecerles &quot;Comando&quot; y dentro el (o los) campo definido (en mi ejemplo es FI).&amp;nbsp; Pueden arrastrar el campo al informe y previsualizarlo.&lt;br /&gt;
&lt;br /&gt;
Cómo funciona?&amp;nbsp; Si se fijan en el código, estoy construyendo una tabla temporal para guardar el valor final del parámetro que quiero pasar al SP.&amp;nbsp; Luego construyo un query en una variable y lo ejecuto con &quot;EXEC&quot;, así que el valor del parámetro ya estará en la tabla temporal y podré usarlo cuando quiera, ya sea directo de la tabla, o haciendo un select para asignarlo a otra variable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/960772947932113586/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2014/10/crystalreports-y-un-stored-procedure.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/960772947932113586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/960772947932113586'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2014/10/crystalreports-y-un-stored-procedure.html' title='CrystalReports y un Stored Procedure con parametro DateTime'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-4642476858997117429</id><published>2014-03-10T10:10:00.002-07:00</published><updated>2014-03-10T10:11:32.779-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="auto"/><category scheme="http://www.blogger.com/atom/ns#" term="cerrar"/><category scheme="http://www.blogger.com/atom/ns#" term="client"/><category scheme="http://www.blogger.com/atom/ns#" term="exe"/><category scheme="http://www.blogger.com/atom/ns#" term="inactivity"/><category scheme="http://www.blogger.com/atom/ns#" term="logoff"/><category scheme="http://www.blogger.com/atom/ns#" term="logout"/><category scheme="http://www.blogger.com/atom/ns#" term="saleslogix"/><title type='text'>Auto cerrar el cliente de SalesLogix en inactividad (auto logoff auto logout)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Muchas veces en las implementaciones es necesario incorporar una funcionalidad para &quot;auto cerrar&quot; el cliente de SalesLogix cuando el usuario deja de utilizarlo.&lt;br /&gt;
&lt;br /&gt;
En vista de que el cliente no trae esta funcionalidad directamente de la caja, aquí les traigo un programita en NET que se encarga de hacerlo.&amp;nbsp; Si analizan el código verán que esto aplica para cualquier aplicación, no únicamente SalesLogix, y si lo modifican un poco, pueden hacer &quot;logoff&quot; de la sesión del usuario en lugar de &quot;matar&quot; el EXE... todo depende de ustedes.&lt;br /&gt;
&lt;br /&gt;
Les voy a mostrar puntualmente como monitorear y automatizar el cierre, pero cómo ejecutan el monitor cuando SalesLogix se abre se los dejo a su criterio.&amp;nbsp; Además, les estoy compartiendo el prototipo inicial aunque 100% funcional, así que no hay comentarios y parte del código puede no verse tan &quot;lindo&quot;, por favor no critiquen!&lt;br /&gt;
&lt;br /&gt;
Para esto utilicé Visual Basic NET 2010.&amp;nbsp; No recuerdo si tuve que añadir una referencia a Microsoft.VisualBasic.Compatibility.dll pero el código funciona perfectamente bien sin modificarle nada!&lt;br /&gt;
&lt;br /&gt;
Primero, creamos un formulario en nuestra aplicación y le insertamos un ListBox que se llamará &quot;List1&quot;.&amp;nbsp; Le agregamos un timer &quot;Timer1&quot; con intervalo de 50, y un &quot;Timer2&quot; con intervalo de 1000.&lt;br /&gt;
&lt;br /&gt;
Luego en el código del formulario pegamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3d85c6;&quot;&gt;Option Strict Off&lt;br /&gt;Option Explicit On&lt;br /&gt;Imports VB = Microsoft.VisualBasic&lt;br /&gt;&lt;br /&gt;Friend Class Form1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits System.Windows.Forms.Form&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Declare Function GetAsyncKeyState Lib &quot;user32&quot; (ByVal vKey As Integer) As Short&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim timeout As Short&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim start As Short&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim hwnd As Integer = 0&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.Hide()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; On Error GoTo Err&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.ShowInTaskbar = False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timeout = CDbl(VB.Command()) * 60&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Sub&lt;br /&gt;err:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timeout = 300&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub Timer1_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Timer1.Tick&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Dim i As Object&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Dim lngBufferLen As Integer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strClassName As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim lngResult As Integer&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; For i = 0 To 255&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; If GetAsyncKeyState(i) Then&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Next i&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim auxhwnd As Integer = GetForegroundWindow()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lngBufferLen = GetWindowTextLength(auxhwnd) + 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strClassName = Space(lngBufferLen)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lngResult = GetWindowText(auxhwnd, strClassName, lngBufferLen)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strClassName = VB.Left(strClassName, lngBufferLen - 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If InStr(1, strClassName, &quot;Sage SalesLogix&quot;) &amp;gt; 0 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hwnd = auxhwnd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For i = 0 To 255&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If GetAsyncKeyState(i) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List1.Items.Add(&quot;Tecla o Mouse - &quot; &amp;amp; strClassName &amp;amp; &quot; Handle: &quot; &amp;amp; auxhwnd.ToString)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next i&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub Timer2_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Timer2.Tick&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; On Error GoTo salida&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start = start + 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If start = timeout Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If hwnd &amp;lt;&amp;gt; 0 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim pid As Integer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetWindowThreadProcessId(hwnd, pid)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim xproc As Process = Process.GetProcessById(pid)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xproc.Kill()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox(&quot;Se ha cerrado el SalesLogix porque ha llegado al tiempo límite de inactividad!&quot;, vbInformation, &quot;Inactividad Detectada&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Sub&lt;br /&gt;salida:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;br /&gt;&lt;br /&gt;End Class&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Ahora, creamos un módulo que yo llamé &quot;Module1&quot; y le pegamos lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3d85c6;&quot;&gt;Option Strict Off&lt;br /&gt;Option Explicit On&lt;br /&gt;Module Module1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Declare Function GetForegroundWindow Lib &quot;user32&quot; () As Integer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Declare Function GetWindowTextLength Lib &quot;user32&quot;&amp;nbsp; Alias &quot;GetWindowTextLengthA&quot;(ByVal hwnd As Integer) As Integer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Declare Function GetWindowText Lib &quot;user32&quot;&amp;nbsp; Alias &quot;GetWindowTextA&quot;(ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Declare Function GetWindowThreadProcessId Lib &quot;user32.dll&quot; (ByVal hwnd As IntPtr, ByRef lpdwProcessID As Integer) As Integer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3d85c6;&quot;&gt;End Module&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Listo! Prueben abriendo un SalesLogix, luego ejecuten el programa.&amp;nbsp; Si vieron el Form Load, notarán que si al ejecutarlo lo hacen con un número, estarán estableciendo el tiempo en minutos del &quot;time out&quot; que cierra el SalesLogix.&amp;nbsp; Si no lo establecen, se va por default a 5 minutos.&lt;br /&gt;
&lt;br /&gt;
Si hacen clic con el ratón, o presionan alguna tecla, verán en el ListBox como va registrando la actividad, y luego del tiempo establecido de no usarlo, pues lo cerrará.&lt;br /&gt;
&lt;br /&gt;
El truco con el programita, es que SalesLogix debe estar &quot;en foco&quot; en algún momento mientras se monitorea para que se pueda recoger el &quot;hwnd&quot; del EXE, pero les digo que desde que lo uso, nunca nadie ha reportado que el SalesLogix se ha mantenido abierto luego de la cantidad de minutos establecida.&lt;br /&gt;
&lt;br /&gt;
Si esta entrada te sirvió, porfa, haz clic a algún anuncio y míralo un par de segundos... ;)&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/4642476858997117429/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2014/03/auto-cerrar-el-cliente-de-saleslogix.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/4642476858997117429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/4642476858997117429'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2014/03/auto-cerrar-el-cliente-de-saleslogix.html' title='Auto cerrar el cliente de SalesLogix en inactividad (auto logoff auto logout)'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-6272411853122379223</id><published>2013-10-28T13:09:00.002-07:00</published><updated>2013-10-28T13:09:36.907-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="herramienta"/><category scheme="http://www.blogger.com/atom/ns#" term="inaport"/><category scheme="http://www.blogger.com/atom/ns#" term="insert"/><category scheme="http://www.blogger.com/atom/ns#" term="insertar"/><category scheme="http://www.blogger.com/atom/ns#" term="saleslogix"/><category scheme="http://www.blogger.com/atom/ns#" term="scribe"/><category scheme="http://www.blogger.com/atom/ns#" term="tool"/><title type='text'>Importar data a SalesLogix sin Scribe ni Inaport - Herramienta gratis</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Siempre se dice que es necesario importar la data utilizando las claves que maneja SalesLogix, y ciértamente, aunque funciona insertar un valor numérico convertido a cadena, la verdad que se ve muy poco profesional trabajar de esta manera.&lt;br /&gt;
&lt;br /&gt;
Se me ha dado un par de ocasiones, que en la implementación es necesario cargar maestros de datos con gran número de registros (10,000 ó +) que me han pasado en un Excel y por alguna razón, no he tenido disponibilidad de usar ni Scribe ni Inaport.&lt;br /&gt;
&lt;br /&gt;
Para fines educativos, he creado una herramienta que permite generar un número determinado de registros, y luego por &quot;query&quot; de base de datos, he realizado los &quot;updates&quot;.&lt;br /&gt;
&lt;br /&gt;
Para descargar la herramienta lo puedes hacer de GitHub &lt;a href=&quot;https://github.com/scorpile/Development&quot; target=&quot;_blank&quot;&gt;https://github.com/scorpile/Development&lt;/a&gt; donde también encontrarás el código fuente.&amp;nbsp; Eso si! Es una herramienta que hice muy rápido y no hice el &quot;error handling&quot; así que no critquen!&lt;br /&gt;
&lt;br /&gt;
Primero necesitamos importar todos los registros que deseemos cargar del Excel a SQL u Oracle.&amp;nbsp; Yo lo he conseguido creando la tabla auxiliar (a la que llamaré TEST) y colocando los campos que corresponden a las columnas en el Excel.&amp;nbsp; Luego he creado una fórmula en Excel para crear una sentencia p.ej: &quot;INSERT INTO TEST (ACCOUNT,CONTACT,EMAIL,MAINPHONE) VALUES (&#39;VALOR&#39;,&#39;VALOR&#39;,&#39;VALOR&#39;,&#39;VALOR&#39;)&quot; y he concatenado las columnas para que se registren los valores.&amp;nbsp; Propagando la fórmula hasta abajo, he logrado conseguir insertar todos mis valores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdBG6usZK9WLzl5-M9BXprAiRlSF2WbV8-EHH4u-ODJZAq6oLmlGZ2xMMbw3gOeJJKlRJ5QZ4-wznWRljK8bg5DsFSLAeK0t3HLCsyJK8lAwQFDcI1G7MQBmC8GRCKTQoWreZYxAkECS4/s1600/importar01.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;39&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdBG6usZK9WLzl5-M9BXprAiRlSF2WbV8-EHH4u-ODJZAq6oLmlGZ2xMMbw3gOeJJKlRJ5QZ4-wznWRljK8bg5DsFSLAeK0t3HLCsyJK8lAwQFDcI1G7MQBmC8GRCKTQoWreZYxAkECS4/s320/importar01.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Luego abrimos la herramienta:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhguzN198Rh5WonvuwLwSnlqmTtmfMhMxZlnHgqMwuMGXSooTgMWDoRxVE1eOED4WSJPJqKvxJJBlx9QYCriJJH8IN8f-TiATpT16TE3qtPaMfDELepejFD2uS6RGTNh8bkU3mVNEjE75Q/s1600/importar02.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhguzN198Rh5WonvuwLwSnlqmTtmfMhMxZlnHgqMwuMGXSooTgMWDoRxVE1eOED4WSJPJqKvxJJBlx9QYCriJJH8IN8f-TiATpT16TE3qtPaMfDELepejFD2uS6RGTNh8bkU3mVNEjE75Q/s320/importar02.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Llenamos los datos del Servidor (ya se que dice Serevidor, fue un &quot;typo&quot; y ya les dije que fue algo rápido).&amp;nbsp; Este es el de SLX y no el de BD.&amp;nbsp; Igual el conector y el pass del usuario Admin.&lt;br /&gt;
&lt;br /&gt;
Colocamos la tabla que en este caso utilizaré Account, utilizaré el campo USERFIELD1 para enlazar, y en este caso es necesario marcar el checkbox &quot;Utilizar&quot; del SECCODEID ya que la tabla Account tiene habilitada la seguridad.&amp;nbsp; Colocamos una cantidad N de registros a insertar.&lt;br /&gt;
&lt;br /&gt;
Al final, presionamos el botón &quot;Realizar la Inserción&quot; y el programa se conectará a SalesLogix e insertará la cantidad especificada de registros en la tabla especificada, y en el campo de enlace, colocará valores como &quot;SLXKey1, SLXKey2, SLXKey3 ... SLXKeyN&quot;.&lt;br /&gt;
&lt;br /&gt;
Por último, realizamos el update con el siguiente &quot;query&quot;:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;UPDATE SYSDBA.ACCOUNT SET SYSDBA.ACCOUNT.ACCOUNT = AUX.ACCOUNT FROM&lt;br /&gt;(&lt;br /&gt;SELECT &#39;SlxKey&#39; + CAST (ROW_NUMBER () OVER (ORDER BY CAMPO) + 3 AS varchar) AS ID,ACCOUNT FROM SYSDBA.TEST&lt;br /&gt;) AS AUX WHERE SYSDBA.ACCOUNT.USERFIELD1 = AUX.ID&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Mucho cuidado!&amp;nbsp;&lt;/b&gt; Como pueden apreciar, estamos actualizando el valor de Account.Account con el valor del campo Valor en la tabla auxiliar &quot;Test&quot;.&amp;nbsp; Obvio los demás campos los ponemos en el mismo update.&lt;br /&gt;
&lt;br /&gt;
Si no se tiene cuidado con lo que se está haciendo, en lugar de una ayuda lo que vamos es a destruir nuestra tabla. &lt;br /&gt;
&lt;br /&gt;
Lo que deben tener cuidado es con valores en los campos que ya contengan la comilla simple &quot; &#39; &quot; en cuyo caso, desde el Excel las reemplazarían por doble comilla simple (2 veces &#39; ).&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/6272411853122379223/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2013/10/importar-data-saleslogix-sin-scribe-ni.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/6272411853122379223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/6272411853122379223'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2013/10/importar-data-saleslogix-sin-scribe-ni.html' title='Importar data a SalesLogix sin Scribe ni Inaport - Herramienta gratis'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdBG6usZK9WLzl5-M9BXprAiRlSF2WbV8-EHH4u-ODJZAq6oLmlGZ2xMMbw3gOeJJKlRJ5QZ4-wznWRljK8bg5DsFSLAeK0t3HLCsyJK8lAwQFDcI1G7MQBmC8GRCKTQoWreZYxAkECS4/s72-c/importar01.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-8746870063060347502</id><published>2013-04-11T11:45:00.001-07:00</published><updated>2013-04-11T11:45:24.271-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="64 bits"/><category scheme="http://www.blogger.com/atom/ns#" term="8"/><category scheme="http://www.blogger.com/atom/ns#" term="Instalar"/><category scheme="http://www.blogger.com/atom/ns#" term="Install"/><category scheme="http://www.blogger.com/atom/ns#" term="Knowledge Sync"/><category scheme="http://www.blogger.com/atom/ns#" term="R2"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows 2008"/><title type='text'>Instalar Knowledge Sync 8 en Windows 2008 R2 (64 bits)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Rápido y directo.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 0.35cm;&quot;&gt;
Necesitarás tener instalado el runtime de Visual Basic 5 (Msvbvm50.exe) y el Jet 3.5 (el Jet35sp3.exe funciona perfecto) antes de empezar a instalar Knowledge Sync.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0.35cm;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0.35cm;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0.35cm;&quot;&gt;
Luego procedemos con el IM64.exe y el KS_Setup_V81e.exe.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0.35cm;&quot;&gt;
En este punto realizamos la migración de la base de datos si es necesaria.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0.35cm;&quot;&gt;
Además es necesario el archivo VB5DB.dll el cual deben obtener de una versión anterior de Windows que tengan a la mano, o si se sienten aventureros, pueden bajar el dll de uno de los ya conocidos sitios de DLL&#39;s que hay en internet.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0.35cm;&quot;&gt;
Este dll lo copian en C:\Windows\SysWOW64 y lo registran con el regsvr32.exe que está en esa misma carpeta.&amp;nbsp; Esto es muy importante!&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0.35cm;&quot;&gt;
Si no instalan el VB5DB.dll, no van a poder editar ni crear conexiones nuevas en Knowledge Sync.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0.35cm;&quot;&gt;
Por último, no olviden que Knowledge Sync trabaja con ODBC, por lo que para administrarlos debemos ejecutar el odbcad32.exe que está en C:\Windows\SysWOW64.&lt;/div&gt;
&lt;div style=&quot;margin-bottom: 0.35cm;&quot;&gt;
Si creamos los ODBC desde la herramienta de ODBC que está entre las &quot;Herramientas Administrativas&quot;, estaremos haciéndolo para aplicaciones de 64 bits, y cunando estemos en Knowledge Sync nos vamos a volver locos buscando los ODBC y lógico que nunca van a aparecer. &lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/8746870063060347502/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2013/04/instalar-knowledge-sync-8-en-windows.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/8746870063060347502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/8746870063060347502'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2013/04/instalar-knowledge-sync-8-en-windows.html' title='Instalar Knowledge Sync 8 en Windows 2008 R2 (64 bits)'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-8112174291555283020</id><published>2012-07-11T16:40:00.000-07:00</published><updated>2012-07-11T16:40:52.945-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="7.5"/><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="campos por nombre"/><category scheme="http://www.blogger.com/atom/ns#" term="entity"/><category scheme="http://www.blogger.com/atom/ns#" term="fields by name"/><category scheme="http://www.blogger.com/atom/ns#" term="por programación"/><category scheme="http://www.blogger.com/atom/ns#" term="programatically"/><category scheme="http://www.blogger.com/atom/ns#" term="saleslogix"/><title type='text'>Manipular campos por su nombre (por programación)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Esto que voy a escribir no sólo aplica a SalesLogix, sino a cualquier programación que estén haciendo en C#, o en cualquier otro lenguaje NET si prestan suficiente atención.&lt;br /&gt;
&lt;br /&gt;
Un usuario me dió la tarea de crear un formulario con 50 preguntas parametrizables, cuya respuesta debería poderse escribir mediante un TextBox, o mediante un PickList (equivalente del dropdown en SalesLogix).&lt;br /&gt;
&lt;br /&gt;
Al final, lo que se quiere lograr, es que en una tabla &quot;Extension&quot; (relación 1&amp;nbsp;a 1 con la tabla principal) hayan 50 campos con las preguntas y las respuestas así:&amp;nbsp; Campo &quot;Preg1&quot; - Valor &quot;Es casado/a?: Si&quot;.&lt;br /&gt;
&lt;br /&gt;
Poner los campos en el AppArchitect es súmamente sencillo, para hacerlo, coloqué un Label con nombre L, junto le puse un TextBox con nombre T, y junto le puse un Picklist con nombre P.&amp;nbsp; Para efectos de velocidad, los puse dentro de un &quot;Control Container&quot; (esto es sólo en SalesLogix).&amp;nbsp; Luego sólo fue necesario darle copiar al control container e ir pegando los 49 restantes (obviamente ya había creado las celdas).&lt;br /&gt;
&lt;br /&gt;
El SalesLogix lo que hará es pegar los controles y cada vez que los pegas, le suma 1 al Id de cada control, es decir, la primera vez que pegué, el Label le puso L2, al TextBox le puso T2 y al PickList le puso P2.&lt;br /&gt;
&lt;br /&gt;
Muy importante! Al terminar de pegar los controles hay que ir a renombrar los primeros objetos a L1, T1 y P1 respectivamente.&lt;br /&gt;
&lt;br /&gt;
Ok, ahora viene la parte interesante.&lt;br /&gt;
&lt;br /&gt;
Quiero hacer constar, que ninguno de los controles está &quot;Binded&quot; sino que voy a mover todo por programación!&lt;br /&gt;
&lt;br /&gt;
Primero ponemos un botón y en el evento le asignamos el Business Rule &quot;Save&quot;.&lt;br /&gt;
&lt;br /&gt;
Generamos y hacemos &quot;deploy to...&quot; del proyecto (para que vaya el código),&amp;nbsp;y buscamos el &quot;SmartPart&quot; con nuestra encuesta y ubicamos el método donde se guarda el formulario.&lt;br /&gt;
&lt;br /&gt;
Copiamos todo lo que está el método y volvemos al AppArchitect, cambiamos que el botón en lugar de hacer &quot;Business Rule&quot; ahora sea un &quot;C# Snippet Action Item&quot; y pegamos lo que copiamos del formulario en el portal que hicimos el deploy.&lt;br /&gt;
&lt;br /&gt;
Al código, justo antes de donde está &quot;&lt;strong&gt; _entity.Save();&lt;/strong&gt; &quot; hay que agregar lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;for (int i = 1; i&amp;lt;=50; i++)&lt;br /&gt;{&lt;br /&gt;Label lctn = (Label)this.FindControl(&quot;L&quot; + i.ToString());&lt;br /&gt;TextBox tctn = (TextBox)this.FindControl(&quot;T&quot; + i.ToString());&lt;br /&gt;Sage.SalesLogix.Web.Controls.PickList.PickListControl pctn = (Sage.SalesLogix.Web.Controls.PickList.PickListControl)this.FindControl(&quot;P&quot; + i.ToString());&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;_entity.ExtensionEntity_ReqInfo[&quot;Preg&quot; + i.ToString()]=lctn.Text + &quot;: &quot; + tctn.Text + pctn.PickListValue;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
Como pueden observar, la referencia a mi tabla actual se llama &quot; _entity &quot;, y tiene una tabla extensión que se llama &quot; ExtensionEntity_ReqInfo &quot; con los 50 campos que se llaman &quot;Preg1, Preg2...Preg50&quot;.&lt;br /&gt;
&lt;br /&gt;
Las 3 primeras líneas son para obtener los controles en cuestión.&amp;nbsp; La línea final es para llenar la tabla en cada campo &quot;Preg1...Preg50&quot; con la concatenación de [Pregunta] + &quot;: &quot; + [Respuesta].&lt;br /&gt;
&lt;br /&gt;
Ahora agreguemos un evento al &quot;Load&quot; del formulario que también será &quot;C# Snippet Action Item&quot; y al crearlo, asegurémonos de poner en True la opción para que el método sea llamado cada vez que se repinta el formulario.&lt;br /&gt;
&lt;br /&gt;
En el código coloquen lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;string WfRelId = DialogService.DialogParameters[&quot;WfRelId&quot;].ToString();&lt;br /&gt;Sage.Entity.Interfaces.IC_Preguntas&amp;nbsp;pregs = Sage.Platform.EntityFactory.GetById&amp;lt;Sage.Entity.Interfaces.IC_Preguntas&amp;gt;(WfRelId);&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;for (int i = 1; i&amp;lt;=50; i++)&lt;br /&gt;{&lt;br /&gt;Label lctn = (Label)this.FindControl(&quot;L&quot; + i.ToString());&lt;br /&gt;TextBox tctn = (TextBox)this.FindControl(&quot;T&quot; + i.ToString());&lt;br /&gt;Sage.SalesLogix.Web.Controls.PickList.PickListControl pctn = (Sage.SalesLogix.Web.Controls.PickList.PickListControl)this.FindControl(&quot;P&quot; + i.ToString());&lt;br /&gt;string qeRI = (string)pregs[&quot;Question&quot; + i.ToString()];&lt;br /&gt;string prRI = (string)_entity.ExtensionEntity_TicketReqInfo[&quot;Preg&quot; + i.ToString()];&lt;br /&gt;lctn.Text = qeRI;&lt;br /&gt;if (lctn.Text != &quot;&quot;) { if ((string)pregs[&quot;ControlType&quot; + i.ToString()] == &quot;TextBox&quot;) { tctn.Visible = true; tctn.Text = prRI.Replace(qeRI + &quot;: &quot;,&quot;&quot;); } &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;{ pctn.Visible = true; pctn.PickListName=(string)pregs[&quot;PicklistRespName&quot; + i.ToString()]; pctn.PickListValue = prRI.Replace(qeRI + &quot;: &quot;,&quot;&quot;); }&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black; font-size: small;&quot;&gt;Las 2 primeras líneas son, 1, para obtener un parámetro con el ID de registro que corresponde a las preguntas que queremos hacer, y 2, para obtener el registro con las 50 preguntas, las 50 especificaciones de si es TextBox o PickList, y los 50 posibles nombres de PickList.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black; font-size: small;&quot;&gt;Esa tabla llamada C_Preguntas, tiene 4 campos que son el ID,&amp;nbsp;50 columnas de&amp;nbsp;pregunta &quot;Question1...Question50&quot;, 50 columnas de tipo &quot;ControlType1...ControlType50&quot; y 50 columnas para establecer el nombre del picklist &quot;PicklistRespName1...PicklistRespName50&quot;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black; font-size: small;&quot;&gt;Las preguntas van callendo en la línea con la variable &quot; qeRI &quot; y las respuestas en la siguiente en la variable &quot; prRI &quot;.&amp;nbsp; Pero ojo, al guardar, dijimos que la respuesta se guardaba como [Pregunta] + &quot;: &quot; + [Respuesta].&amp;nbsp; Por eso hay unos Replace en la sentencia siguiente.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black; font-size: small;&quot;&gt;En el IF, vemos que dependiendo del &quot;ControlType&quot;, si es TextBox, mostramos el campo TextBox correspondiente con su respuesta, y si no, el PickList con el valor seleccionado.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Ya con esto, manipulamos por programación y sin mucho esfuerzo, los 50 campos del formulario.&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/8112174291555283020/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2012/07/manipular-campos-por-su-nombre-por.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/8112174291555283020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/8112174291555283020'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2012/07/manipular-campos-por-su-nombre-por.html' title='Manipular campos por su nombre (por programación)'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-1376589475575571976</id><published>2012-02-23T13:20:00.000-08:00</published><updated>2012-02-23T13:20:46.665-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="11"/><category scheme="http://www.blogger.com/atom/ns#" term="crystal"/><category scheme="http://www.blogger.com/atom/ns#" term="Currency"/><category scheme="http://www.blogger.com/atom/ns#" term="incorrecta"/><category scheme="http://www.blogger.com/atom/ns#" term="incorrecto"/><category scheme="http://www.blogger.com/atom/ns#" term="moneda"/><category scheme="http://www.blogger.com/atom/ns#" term="reports"/><category scheme="http://www.blogger.com/atom/ns#" term="server"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><category scheme="http://www.blogger.com/atom/ns#" term="wrong"/><category scheme="http://www.blogger.com/atom/ns#" term="xii"/><title type='text'>Crystal mostrando la moneda incorrecta</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Se presentó el problema en un cliente de que no importaba lo que hiciéramos en el reporte, al desplegarlo por Web, siempre traía los campos &quot;Currency&quot; formateados con Euros.&lt;br /&gt;
&lt;br /&gt;
Luego de una intensa revisión y pruebas se determinó lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Asegurarse de que el &quot;Reports Portal&quot; está apuntando a su Application Pool y que el pool esté configurado correctamente con WebDLL.&lt;/li&gt;
&lt;li&gt;Revisar las opciones en la pestaña &quot;ASP.NET&quot; del portal de reportes, y en la ventana emergente, ver las opciones en la pestaña &quot;Application&quot; que están relacionadas a la cultura.&amp;nbsp; En este lugar se puede colocar la cultura que desee.&amp;nbsp; Este cambio a nivel de portal, luego debería reflejarse en los ASP.NET de todos los &quot;Virtual Directories&quot; dentro de este portal, pero vale la pena revisarlos.&lt;/li&gt;
&lt;li&gt;Revisar la configuración regional y de idioma del usuario WebDLL (muy importante, firmarse al servidor con el WebDLL porque las opciones regionales son por usuario).&amp;nbsp; Cambiar el idioma, la ubicación, y el idioma en la pestaña &quot;Advanced&quot;.&lt;/li&gt;
&lt;li&gt;Entrar y personalizar la cadena de moneda aunque aparente estar correcta.&lt;/li&gt;
&lt;li&gt;Reiniciar el application pool y el portal de reportes.&lt;/li&gt;
&lt;/ol&gt;
Con estos pasos nuestros reportes web deberían listarse con el formato de moneda correcto. &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/1376589475575571976/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2012/02/crystal-mostrando-la-moneda-incorrecta.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/1376589475575571976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/1376589475575571976'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2012/02/crystal-mostrando-la-moneda-incorrecta.html' title='Crystal mostrando la moneda incorrecta'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-6111992876387291129</id><published>2012-01-24T13:08:00.000-08:00</published><updated>2016-11-26T07:18:40.265-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="7.5.3"/><category scheme="http://www.blogger.com/atom/ns#" term="aci"/><category scheme="http://www.blogger.com/atom/ns#" term="area-category-issue"/><category scheme="http://www.blogger.com/atom/ns#" term="busqueda"/><category scheme="http://www.blogger.com/atom/ns#" term="dependant"/><category scheme="http://www.blogger.com/atom/ns#" term="dependiente"/><category scheme="http://www.blogger.com/atom/ns#" term="font"/><category scheme="http://www.blogger.com/atom/ns#" term="fuente"/><category scheme="http://www.blogger.com/atom/ns#" term="Lookup"/><category scheme="http://www.blogger.com/atom/ns#" term="saleslogix"/><category scheme="http://www.blogger.com/atom/ns#" term="size"/><category scheme="http://www.blogger.com/atom/ns#" term="tamaño"/><category scheme="http://www.blogger.com/atom/ns#" term="web"/><title type='text'>Fuentes más pequeñas en diálog Area-Category-Issue (SLX7.5.3 Web)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Este es un problema más que nada estético.&lt;br /&gt;
&lt;br /&gt;
Resulta que las fuentes del control Area-Category-Issue son muy grandes y a veces se hace dificil seleccionar la opción adecuada.&lt;br /&gt;
&lt;br /&gt;
Hasta que Sage no incorpore una propiedad para establecer el ancho de los &quot;dependant&quot; lookups estamos lmitados a por lo menos hacer más pequeñas las letras.&lt;br /&gt;
&lt;br /&gt;
Para esto, buscamos en la carpeta &quot;css&quot; el archivo que se llama sage-styles.css y agregamos el siguiente estilo:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: #0b5394;&quot;&gt;
.formtable .yui-panel .hd select&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; font-size: 80%;&lt;br /&gt;
}&lt;/div&gt;
&lt;br /&gt;
Con esto haremos las letras más chicas y nos dará un pequeño espacio adicional para leer las opciones:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWzuSidveJEgHjiCa2H1y8nMPZPkMcADXsm1vzo2q5GzAeOfro41XTUnsDwE_h7z5iD5XTkOwmhBD8j6TWV376ibEIqQB2gln3RLXFeYqZGnUIXSBvPNrutVccMK_FVHnnwpivEzkYvJA/s1600/aci.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;315&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWzuSidveJEgHjiCa2H1y8nMPZPkMcADXsm1vzo2q5GzAeOfro41XTUnsDwE_h7z5iD5XTkOwmhBD8j6TWV376ibEIqQB2gln3RLXFeYqZGnUIXSBvPNrutVccMK_FVHnnwpivEzkYvJA/s640/aci.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En este caso era para Area-Category-Issue, pero la verdad el cambio funciona para cualquier lookup dependiente.&lt;br /&gt;
&lt;br /&gt;
Actualización:&amp;nbsp; Existe un post en CustomerFX de un conocido programador.&amp;nbsp; El enlace es&amp;nbsp;&lt;a href=&quot;http://customerfx.com/pages/integrationblog/2012/07/27/expanding-the-area-category-issue-picklist-popup-screen-in-the-saleslogix-web-client.aspx&quot; target=&quot;_blank&quot;&gt;http://customerfx.com/pages/integrationblog/2012/07/27/expanding-the-area-category-issue-picklist-popup-screen-in-the-saleslogix-web-client.aspx&lt;/a&gt; y en el mismo explica cómo modificar unos archivos &quot;js&quot; (javascript) internos del SalesLogix los cuales permiten ampliar este dependent lookup.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Actualización 2:&amp;nbsp; Utilizando CSS encontré un método mucho mejor, como mil veces más sencillo y aplica para cualquier campo que necesiten ampliar.&amp;nbsp; El post lo puse en: &lt;/b&gt;&amp;nbsp;&lt;a href=&quot;http://www.slxdeveloper.com/forum.aspx?forumid=4002&amp;amp;postid=32203&quot; target=&quot;_blank&quot;&gt;http://www.slxdeveloper.com/forum.aspx?forumid=4002&amp;amp;postid=32203&lt;/a&gt; &lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/6111992876387291129/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2012/01/fuentes-mas-pequenas-en-dialog-area.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/6111992876387291129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/6111992876387291129'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2012/01/fuentes-mas-pequenas-en-dialog-area.html' title='Fuentes más pequeñas en diálog Area-Category-Issue (SLX7.5.3 Web)'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWzuSidveJEgHjiCa2H1y8nMPZPkMcADXsm1vzo2q5GzAeOfro41XTUnsDwE_h7z5iD5XTkOwmhBD8j6TWV376ibEIqQB2gln3RLXFeYqZGnUIXSBvPNrutVccMK_FVHnnwpivEzkYvJA/s72-c/aci.jpeg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-1021131441214968084</id><published>2012-01-24T07:32:00.000-08:00</published><updated>2012-01-24T07:33:46.505-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="agrandar"/><category scheme="http://www.blogger.com/atom/ns#" term="expand"/><category scheme="http://www.blogger.com/atom/ns#" term="expandir"/><category scheme="http://www.blogger.com/atom/ns#" term="grow"/><category scheme="http://www.blogger.com/atom/ns#" term="nombre"/><category scheme="http://www.blogger.com/atom/ns#" term="reportes"/><category scheme="http://www.blogger.com/atom/ns#" term="reportname"/><category scheme="http://www.blogger.com/atom/ns#" term="reports"/><category scheme="http://www.blogger.com/atom/ns#" term="saleslogix"/><category scheme="http://www.blogger.com/atom/ns#" term="size"/><title type='text'>Expandir los nombres de los reportes (SLX 7.5.3 Web)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Constantemente los clientes se quejan de que el espacio donde se ven los reportes es muy reducido, y el nombre de la mayoría siempre queda truncado por el tamaño del control.&lt;br /&gt;
&lt;br /&gt;
Para solucionarlo, deben buscar el smartpart que se llama Reporting.ascx y buscar la línea que tiene el control de selección de reportes.&amp;nbsp; Pueden hacer una búsqueda de:&amp;nbsp; &lt;em&gt;&lt;strong&gt;select name=&quot;reportname&quot;&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
Seguidamente vamos a modificar el DIV que está al inicio, y le vamos a colocar 500 pixeles de ancho en el atributo STYLE.&amp;nbsp; También vamos a agregar el atributo STYLE al &quot;select control&quot; y le pondremos de ancho un 100%.&amp;nbsp; La línea completa debería quedar así:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #0b5394;&quot;&gt;&amp;lt;div &lt;strong&gt;style=&quot;width:500px&quot;&lt;/strong&gt;&amp;gt;&amp;lt;select name=&quot;reportname&quot; id=&quot;reportname&quot; onchange=&quot;reportNameChanged()&quot; size=&quot;12&quot; &lt;strong&gt;style=&quot;width:100%&quot;&lt;/strong&gt;&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Puse en negrita lo que deben agregar.&lt;br /&gt;
&lt;br /&gt;
Al visualizar el listado de reportes se debería ver así:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcHhGKXbJeVEFZMxI6ojg4DN0pBRZBltsBJlMh-H4rdnAuzoJnozE35Q4QaARV3iqnOz1LQC0SHF3f8Ur2tlePH-sUxXtjLh5fNzdh2FFsdblBukeb5p3bK6XuJO27fu_rTtUQiaii27c/s1600/sizereportes.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;467&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcHhGKXbJeVEFZMxI6ojg4DN0pBRZBltsBJlMh-H4rdnAuzoJnozE35Q4QaARV3iqnOz1LQC0SHF3f8Ur2tlePH-sUxXtjLh5fNzdh2FFsdblBukeb5p3bK6XuJO27fu_rTtUQiaii27c/s640/sizereportes.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Mucho mejor para los usuarios que el pequeño espacio que trae por defecto!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/1021131441214968084/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2012/01/expandir-los-nombres-de-los-reportes.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/1021131441214968084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/1021131441214968084'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2012/01/expandir-los-nombres-de-los-reportes.html' title='Expandir los nombres de los reportes (SLX 7.5.3 Web)'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcHhGKXbJeVEFZMxI6ojg4DN0pBRZBltsBJlMh-H4rdnAuzoJnozE35Q4QaARV3iqnOz1LQC0SHF3f8Ur2tlePH-sUxXtjLh5fNzdh2FFsdblBukeb5p3bK6XuJO27fu_rTtUQiaii27c/s72-c/sizereportes.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-617807058241697348</id><published>2012-01-23T03:52:00.000-08:00</published><updated>2012-01-23T03:52:35.476-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="7.5.3"/><category scheme="http://www.blogger.com/atom/ns#" term="form"/><category scheme="http://www.blogger.com/atom/ns#" term="formulario"/><category scheme="http://www.blogger.com/atom/ns#" term="Proceso de ventas"/><category scheme="http://www.blogger.com/atom/ns#" term="Sales Process"/><category scheme="http://www.blogger.com/atom/ns#" term="saleslogix"/><title type='text'>Mostrar formularios del DialogWorkSpace en un Sales Process (SLX7.5.3)</title><content type='html'>Muchos de ustedes habrán notado que no es posible mostrar formularios en los Sales Processes web.&lt;br /&gt;
&lt;br /&gt;
Recientemente tuve la necesidad de revisar esto por un flujo muy interesante de un cliente, así que les traigo la solución, un poco &quot;dirty&quot; como dirían, pero totalmente funcional.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Paso 1 - Procesando los &quot;Form&quot; en los Sales Process:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Busquen dentro de la carpeta &lt;b&gt;&lt;i&gt;SmartParts&lt;/i&gt;&lt;/b&gt;, la carpeta &lt;b&gt;&lt;i&gt;OpportunitySalesProcess&lt;/i&gt;&lt;/b&gt;.&amp;nbsp; Dentro abran para editar en notepad el archivo que se llama &lt;i&gt;&lt;b&gt;OpportunitySalesProcess_ClientScript.js&lt;/b&gt;&lt;/i&gt; y realicen una búsqueda de la función &lt;b&gt;&lt;i&gt;executeAction&lt;/i&gt;&lt;/b&gt;.&amp;nbsp; Allí podrán ver que la opción &lt;b&gt;&lt;i&gt;case &#39;Form&#39;&lt;/i&gt;&lt;/b&gt; no hace absolútamente nada, así que deberán cambiarla de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &#39;Form&#39;:&lt;/span&gt;&lt;br style=&quot;color: #0b5394;&quot; /&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessAction.prototype.Init = Init_Form;&lt;/span&gt;&lt;br style=&quot;color: #0b5394;&quot; /&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boolExecute = true;&lt;/span&gt;&lt;br style=&quot;color: #0b5394;&quot; /&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Paso 2 - Creando la función para mostrar el diálogo:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Ok, ahora vamos a crear la función que nos permitirá mostrar nuestro diálogo.&amp;nbsp; Busquemos un espacio para escribir nuestra función y escriban lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;function Init_Form() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var xmlDoc = sp_GetXmlDoc(this.xml);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var objFrm = xmlDoc.getElementsByTagName(&#39;FormAction&#39;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var strFormName = objFrm[0].getElementsByTagName(&#39;LanForm&#39;)[0].getElementsByTagName(&#39;Name&#39;)[0].firstChild.nodeValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DialogWorkspace.show(strFormName,&#39;800&#39;,&#39;800&#39;,&#39;800&#39;,&#39;800&#39;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Finish();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;br /&gt;
}&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
Ven los 800?&amp;nbsp; Lastimósamente no he logrado que el formulario sea de más de 500x500 y que esté en otro lugar que no sea X=0 Y=0, pero como es funcional, no me molesta tanto.&amp;nbsp; Vieron también que dice LanForm?&amp;nbsp; Déjenlo así, ya verán por qué.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Paso 3 - Creando el formulario... perdón, los!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Esto es lo único que puede parecer trillado.&amp;nbsp; Hay que crear el formulario en LAN y en WEB, es decir, en Architect y en Application Architect.&amp;nbsp; Por qué? porque el campo para poner el Web Form en el Sales Process utiliza los formularios que se hagan desde el WebAdmin, y no vamos a regresar a 7.0 con su programación horrible...&amp;nbsp; queremos un formulario de 7.5.3.&lt;br /&gt;
&lt;br /&gt;
Como la función que hice no pasa parámetros (si encuentran la manera correcta de hacerlo les ruego que me avisen) el formulario que van a abrir recibirá el ID de la oportunidad, así que es mejor que vayamos a la entidad Opportunity para crear el formulario y de allí ya depende de su ingenio para darle funcionalidad.&lt;br /&gt;
&lt;br /&gt;
Yo le voy a llamar dlgTestDrive:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdnN5YBNlgmaKNmmqW-wN31vcKbc4ZbekVUJCBpv60roc8CDPxTCYz_0zZHPQG35IHRekBLZBZeMJdPuMjWJsp2cW27w3jWOJjO2mY5shkV9Tls7oLbceVTy124HYJQ4hRZjZS2hvRgz0/s1600/dlgTestDrive.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdnN5YBNlgmaKNmmqW-wN31vcKbc4ZbekVUJCBpv60roc8CDPxTCYz_0zZHPQG35IHRekBLZBZeMJdPuMjWJsp2cW27w3jWOJjO2mY5shkV9Tls7oLbceVTy124HYJQ4hRZjZS2hvRgz0/s320/dlgTestDrive.jpg&quot; width=&quot;258&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Recuerden crear en el Architect un formulario que se llame igual, aunque esté vacío!&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDnsGy71dGmQMMcNzsnxNgmJnPw-UsHa5T4nc-WOczUOtH6mkUt9pYBTPyiRrByveiGKSWCMEZ_eNhJoN6FHaJJPOvwK6DA6doPp5jhCxK_rIVMtSZGymAh2jzL7HbJlWiLUD9FQHMsmo/s1600/dlgTestDrive2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDnsGy71dGmQMMcNzsnxNgmJnPw-UsHa5T4nc-WOczUOtH6mkUt9pYBTPyiRrByveiGKSWCMEZ_eNhJoN6FHaJJPOvwK6DA6doPp5jhCxK_rIVMtSZGymAh2jzL7HbJlWiLUD9FQHMsmo/s1600/dlgTestDrive2.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Paso 4 - Incorporando el formulario al Sales Process:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Ahora creamos un Sales Process y en algún punto, seleccionamos acción Form, y buscamos nuestro formulario:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbhCQ2edhS-HiYH1D6zUBypNQHscnr_k3wpqevdl3bYMJaglZFBHDOzRuVRQrJtK0aQXOucDJeyorjjDyOxwj9PCQzRVQkkyAuZ6ZL4wcZnTzLMMjzKcy4FE2gRscjASQLlbPgAGU_i0E/s1600/dlgTestDrive3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;120&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbhCQ2edhS-HiYH1D6zUBypNQHscnr_k3wpqevdl3bYMJaglZFBHDOzRuVRQrJtK0aQXOucDJeyorjjDyOxwj9PCQzRVQkkyAuZ6ZL4wcZnTzLMMjzKcy4FE2gRscjASQLlbPgAGU_i0E/s320/dlgTestDrive3.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ahora falta únicamente probarlo, para ellos abrimos un SalesLogix desde Web, buscamos alguna oportunidad, le ponemos el Sales Process y buscamos el paso con el form.&amp;nbsp; Le damos clic a la descripción y:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0Rvu09_Ukz09G-cBFWE0XFpCxkNHKPMhDrQ9O69aMc7AFLeJm0S7u3ztni9OoFgl-jz_dl6anp3EXkwRqc3HvV8nx1sYEyxVuqwo3mE9eMgBMh_wjJyjiRpBn0W_psWYvgC-17W7efNk/s1600/dialogo.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;275&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0Rvu09_Ukz09G-cBFWE0XFpCxkNHKPMhDrQ9O69aMc7AFLeJm0S7u3ztni9OoFgl-jz_dl6anp3EXkwRqc3HvV8nx1sYEyxVuqwo3mE9eMgBMh_wjJyjiRpBn0W_psWYvgC-17W7efNk/s320/dialogo.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Excelente!</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/617807058241697348/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2012/01/mostrar-formularios-del-dialogworkspace.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/617807058241697348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/617807058241697348'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2012/01/mostrar-formularios-del-dialogworkspace.html' title='Mostrar formularios del DialogWorkSpace en un Sales Process (SLX7.5.3)'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdnN5YBNlgmaKNmmqW-wN31vcKbc4ZbekVUJCBpv60roc8CDPxTCYz_0zZHPQG35IHRekBLZBZeMJdPuMjWJsp2cW27w3jWOJjO2mY5shkV9Tls7oLbceVTy124HYJQ4hRZjZS2hvRgz0/s72-c/dlgTestDrive.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-1921428303917231489</id><published>2012-01-18T09:44:00.000-08:00</published><updated>2012-02-02T07:35:04.736-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="7.5"/><category scheme="http://www.blogger.com/atom/ns#" term="7.5.3"/><category scheme="http://www.blogger.com/atom/ns#" term="Currency"/><category scheme="http://www.blogger.com/atom/ns#" term="error"/><category scheme="http://www.blogger.com/atom/ns#" term="format"/><category scheme="http://www.blogger.com/atom/ns#" term="formato"/><category scheme="http://www.blogger.com/atom/ns#" term="localización"/><category scheme="http://www.blogger.com/atom/ns#" term="localization"/><category scheme="http://www.blogger.com/atom/ns#" term="moneda"/><category scheme="http://www.blogger.com/atom/ns#" term="saleslogix"/><category scheme="http://www.blogger.com/atom/ns#" term="wrong"/><title type='text'>Problemas con los campos moneda en SalesLogix Web 7.5.3</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Por alguna razón, los campos tipo moneda (Currency) fallan cuando se utilizan navegadores con localizaciones en lugares fuera de &quot;en-US&quot;, como en mi caso que es &quot;es-PA&quot; porque estoy en Panamá.&lt;br /&gt;
&lt;br /&gt;
El problema que se presenta es que o bien sale un mensaje que dice &quot;input string not in correct format&quot; que impide marcar el botón para guardar, o al guardar el número, por ejemplo &quot;3.99&quot;, el maldito se guarda como &quot;399000&quot; y si seguimos presionando guardar el número se va multiplicando por 1000...&amp;nbsp; súmamente molesto...&lt;br /&gt;
&lt;br /&gt;
Afortunadamente he encontrado una manera de lidiar con los campos moneda y consiste en cambiar los campos tipo moneda a tipo número (Numeric).&lt;br /&gt;
&lt;br /&gt;
Esto depende en gran medida de la implementación, si se van a utilizar todas las pantallas con campos tipo moneda o solo algunos.&amp;nbsp; En todo caso, si se va a realizar input a estos campos, cambiarlos a tipo número me ha dado muy buenos resultados.&lt;br /&gt;
&lt;br /&gt;
Algo importante es que al cambiar los campos a tipo número, hay que colocarles el formato que queremos.&amp;nbsp; En Panamá, el formato sería {0:#,##0.00} lo cual nos presentaría 3211.3 como 3,211.30.&lt;br /&gt;
&lt;br /&gt;
Si estamos en un formulario nativo del Application Architect, hay una propiedad de todos los campos en los formularios que se llama Data Bindings.&amp;nbsp; Dentro se &quot;bindea&quot; el campo a un atributo en la base de datos, y bajo el campo llamado &quot;Binding&quot; hay uno que dice Format String, que sería el lugar para colocar el formato que mostré.&lt;br /&gt;
&lt;br /&gt;
Si es un formulario custom, y se están usando los WebEntityBindings, se colocaría el formato así:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: blue;&quot;&gt;
WebEnityBinding miControl = new WebEntityBinding(&quot;CampoEnBD&quot;, &quot;Text&quot;, &quot;{0:#,##0.00}&quot;, &quot;&quot;);&lt;/div&gt;
&lt;br /&gt;
En ambos casos es muy importante setearle la propiedad &quot;Format Type&quot; del campo a &quot;Number&quot; o el formato no funcionará de la manera correcta.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/1921428303917231489/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2012/01/problemas-con-los-campos-moneda-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/1921428303917231489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/1921428303917231489'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2012/01/problemas-con-los-campos-moneda-en.html' title='Problemas con los campos moneda en SalesLogix Web 7.5.3'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-4135473359279244618</id><published>2012-01-10T06:17:00.000-08:00</published><updated>2012-01-10T06:17:19.185-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="2011 r1"/><category scheme="http://www.blogger.com/atom/ns#" term="bb"/><category scheme="http://www.blogger.com/atom/ns#" term="blackberry"/><category scheme="http://www.blogger.com/atom/ns#" term="mobil"/><category scheme="http://www.blogger.com/atom/ns#" term="os 5"/><category scheme="http://www.blogger.com/atom/ns#" term="os5"/><category scheme="http://www.blogger.com/atom/ns#" term="saleslogix"/><title type='text'>El SalesLogix Mobile 2011 R1 desde un BlackBerry OS 5</title><content type='html'>Esto es una solución simple y sencilla para aquellas personas que están en países donde por algún motivo no es fácil o barato tener un nuevo BlackBerry con OS 6.&lt;br /&gt;
&lt;br /&gt;
Si tienen un Curve u otro modelo de aquellos que sólo soportan BBOS 5, me es grato informarles que podrán utilizar el nuevo portal Mobile de SalesLogix (2011 R1, si, el que es HTML5 y CSS3) simplemente instalando Opera Mini.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHZsjxT9kZcpJLFGUzM5VvElSzBx9VEWYzb9Vm4jfT3uJte7k_YeVjGCtP42LOWvlTNCe20V8lWMhEkR3oL7wazYV2qszJ60kotaPDD2G4gWkC23GxpTOELvGEvQkOhB8tzo-uiV5FMD8/s1600/slxmobile.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;267&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHZsjxT9kZcpJLFGUzM5VvElSzBx9VEWYzb9Vm4jfT3uJte7k_YeVjGCtP42LOWvlTNCe20V8lWMhEkR3oL7wazYV2qszJ60kotaPDD2G4gWkC23GxpTOELvGEvQkOhB8tzo-uiV5FMD8/s320/slxmobile.jpeg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/4135473359279244618/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2012/01/el-saleslogix-mobile-2011-r1-desde-un.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/4135473359279244618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/4135473359279244618'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2012/01/el-saleslogix-mobile-2011-r1-desde-un.html' title='El SalesLogix Mobile 2011 R1 desde un BlackBerry OS 5'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHZsjxT9kZcpJLFGUzM5VvElSzBx9VEWYzb9Vm4jfT3uJte7k_YeVjGCtP42LOWvlTNCe20V8lWMhEkR3oL7wazYV2qszJ60kotaPDD2G4gWkC23GxpTOELvGEvQkOhB8tzo-uiV5FMD8/s72-c/slxmobile.jpeg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-3682908847620453950</id><published>2011-07-22T16:10:00.000-07:00</published><updated>2012-03-21T06:31:01.473-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="clear"/><category scheme="http://www.blogger.com/atom/ns#" term="Lookup"/><category scheme="http://www.blogger.com/atom/ns#" term="lost"/><category scheme="http://www.blogger.com/atom/ns#" term="null"/><category scheme="http://www.blogger.com/atom/ns#" term="pierde"/><category scheme="http://www.blogger.com/atom/ns#" term="saleslogix"/><category scheme="http://www.blogger.com/atom/ns#" term="valor"/><category scheme="http://www.blogger.com/atom/ns#" term="value"/><title type='text'>Lookup se cambia a Nulo en un DialogWorkspace</title><content type='html'>En 7.5.3 me vi en una situación donde por código hay que crear un registro en una tabla al presionar un botón, pero hay que seleccionar un valor de una Lookup para crear el registro.&lt;br /&gt;
&lt;br /&gt;
Se decidió crear la funcionalidad en un SmartPart ubicado en el DialogWorkspace, y además que se pudieran establecer condiciones en tiempo real para el filtrado. &amp;nbsp;Se agregaron 3 checkbox para establecer las condiciones del filtrado por lo que obviamente hay que setear los 3 checkboxes para autopostback, pero al probar la funcionalidad tanto de los 3 checks como del mismo Lookup, el valor devuelto por el Lookup siempre se cambia a nulo luego del postback.&lt;br /&gt;
&lt;br /&gt;
Primero hay que estar seguro que el &quot;Entity&quot; tenga bien mapeado el campo de visualización. &amp;nbsp;Luego hay que asegurarse que el Lookup esté seteado para binding tipo &quot;String&quot; y no &quot;Object&quot;. &amp;nbsp;Con esto el valor se mantiene pero al traer un elemento del Lookup lo que vendrá es el SLXId del registro.&lt;br /&gt;
&lt;br /&gt;
Agregamos un campo TextBox en el formulario que llamaremos lkID y le ponemos visible = false. &amp;nbsp;También agregamos un handle al evento&amp;nbsp;LookupResultValueChanged y dentro del procedimiento le asignamos el valor del Lookup así: &amp;nbsp;this.lkID.Text = this.MyLookup.LookupResultValue.ToString();&lt;br /&gt;
&lt;br /&gt;
Luego agregamos un evento Pre_Render al formulario si no lo tiene ya, y colocamos:&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if (lkID.Text+&quot;$&quot; != &quot;$&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Sage.Entity.Interfaces.IAccount swssel = Sage.Platform.EntityFactory.GetById&amp;lt;Sage.Entity.Interfaces.IAccount(lkID.Text);&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;          &lt;/span&gt;this.MyLookup.Text = swssel.Account;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #38761d;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
Oviamente suponiendo que estabamos haciendo un Lookup sobre la entity IAccount.&lt;br /&gt;
&lt;br /&gt;
De esta manera ya tendríamos el SLXId seleccionado en el campo lkID y el texto en la propiedad Text del mismo Lookup.&lt;br /&gt;
&lt;br /&gt;
Luego complemento con lo de los filtros al Lookup en tiempo real porque me han preguntado muchas veces sobre el tema.</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/3682908847620453950/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2011/07/filtrar-datos-en-un-lookup-en-un.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/3682908847620453950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/3682908847620453950'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2011/07/filtrar-datos-en-un-lookup-en-un.html' title='Lookup se cambia a Nulo en un DialogWorkspace'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-5983259218419603606</id><published>2010-10-12T09:17:00.000-07:00</published><updated>2013-04-11T11:55:12.823-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AddDays"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP"/><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="dias"/><category scheme="http://www.blogger.com/atom/ns#" term="domingo"/><category scheme="http://www.blogger.com/atom/ns#" term="IIS"/><category scheme="http://www.blogger.com/atom/ns#" term="laborales"/><category scheme="http://www.blogger.com/atom/ns#" term="sabado"/><category scheme="http://www.blogger.com/atom/ns#" term="saleslogix"/><category scheme="http://www.blogger.com/atom/ns#" term="saturday"/><category scheme="http://www.blogger.com/atom/ns#" term="sumar"/><category scheme="http://www.blogger.com/atom/ns#" term="sunday"/><category scheme="http://www.blogger.com/atom/ns#" term="workdays"/><title type='text'>Sumar sólo días laborales en C#</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Una funcionalidad que he buscado durante mucho tiempo en Internet es cómo hacer un AddDays que agregue sólo los días laborales.&lt;br /&gt;
&lt;br /&gt;
Adicional a esto, la funcionalidad debe ser para C# porque la quiero utilizar en un proyecto WEB en IIS de SalesLogix.&amp;nbsp; Si alguien conoce una funcionalidad de SalesLogix que lo haga le agradezco me notifique porque no hay documentación de esto.&lt;br /&gt;
&lt;br /&gt;
Al final, si existe o no esta funcionalidad, yo hice mi propia función y aquí les detallo las consideraciones y el código fuente de la función para que puedan adaptarla a sus necesidades.&amp;nbsp; La función que yo diseñé tenía que cumplir con lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt; Debe permitir el AddDays sólo de días laborales de lunes a viernes (aquí en Panamá no se trabaja sábados ni domingos en algunas empresas).&lt;/li&gt;
&lt;li&gt;Debe contemplarse una tabla de días feriados la cual tendrá una vista de mantenimiento manual.&lt;/li&gt;
&lt;li&gt;Sólo se van a agregar días completos, no fracciones de días, y no importa la hora del día en que se haga el AddDays. &lt;/li&gt;
&lt;/ol&gt;
Luego de mucho investigar no encontré ninguna función que cumpliera al 100% estos requerimientos, o que funcionara completamente sin errores ni cálculos errados.&lt;br /&gt;
&lt;br /&gt;
Al analizar un poco los códigos encontrados, todos terminaban en 1 bucle para contar los días 1 por 1 como si estuviéramos frente a un calendario.&lt;br /&gt;
&lt;br /&gt;
Las otras funciones que no utilizan el conteo, se basan en cálculos para contar los días, pero todos caen en un mismo error, que consiste en dividir la cantidad de días que queremos sumar entre 7 para saber el número de fines de semana que hay, y agregar este número al número original.&lt;br /&gt;
&lt;br /&gt;
Esto es un completo error, porque están dividiendo días que aún no han transcurrido, por ejemplo, si quiero una actividad que va a durar 6 días, no me está contemplando el fin de semana en el que ya estaríamos cayendo.&amp;nbsp; Lo correcto, es dividirlo entre 5, que son los días realmente laborales, y al final sumarle los 2, ven?&amp;nbsp; No es lo mismo sumarle 2 por cada 7, que sumarle 2 por cada 5.&amp;nbsp; Pero mucho cuidado, esto es &lt;b&gt;considerando que es una suma&lt;/b&gt;, si por el contrario quisieran sacar las semanas o el número de días laborales entre 2 fechas (diferencia de días, subtract o datediff), no es la misma situación y entonces si es correcto dividir entre 7, porque las 2 fechas si tienen los 2 días del fin de semana de por medio.&lt;br /&gt;
&lt;br /&gt;
Lo otro es lo de la tabla de feriados.&amp;nbsp; La mayoría de los códigos verifican esta tabla por cada uno de los días a sumar, esto también me pareció muy ineficiente.&lt;br /&gt;
&lt;br /&gt;
Mi solución es la siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: #3d85c6;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;protected DateTime DateAgregarLaborales(Int32 add, DateTime FechaInicial) &lt;br /&gt;
{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FechaInicial.DayOfWeek == DayOfWeek.Saturday) { FechaInicial=FechaInicial.AddDays(2); } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FechaInicial.DayOfWeek == DayOfWeek.Sunday) { FechaInicial=FechaInicial.AddDays(1); } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Int32 weeks = add / 5; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; add += weeks * 2; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FechaInicial.DayOfWeek &amp;gt; FechaInicial.AddDays(add).DayOfWeek) { add += 2; } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FechaInicial.AddDays(add).DayOfWeek == DayOfWeek.Saturday) { add +=2; } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Int32 libres =&amp;nbsp; LibresEntre(FechaInicial,FechaInicial.AddDays(add)); &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (libres&amp;gt;0) { return DateAgregarLaborales(0,FechaInicial.AddDays(libres+&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;)); } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else { return FechaInicial.AddDays(add); } &lt;br /&gt;
}&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Las primeras 2 líneas verifican si el día en que se está haciendo la suma es sábado o domingo, esto para no contemplarlo porque queremos saltarnos esos días.&lt;br /&gt;
&lt;br /&gt;
Los días se dividen entre 5 y se multiplica el resultado por 2 para sacar los días libres por cada semana.&lt;br /&gt;
&lt;br /&gt;
Se verifica si el día final es menor al día actual lo cual valida sumas de intervalos menores a 5 o que la fecha quede en domingo (es 0 en C#), y si se estima que el día final es sábado, se suman nuevamente 2 días.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;Al final&lt;/span&gt; se está consultando una función que se llama LibresEntre para consultar a la tabla de feriados y ver si hay días libres entre la fecha inicial y la resultante, y si resulta haber uno o más días libres, se llama recursivamente a la misma función para evitar caer nuevamente en días no laborales.&amp;nbsp; Esto traerá como resultado que a lo sumo, sólo habrá 1 iteración entre la función inicial y su re-llamada.&lt;br /&gt;
&lt;br /&gt;
Esta es la función para los días libres, que está pensada para MS SQL:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;protected Int32 LibresEntre(DateTime Fi, DateTime Ff)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;Sage.Platform.Data.IDataService service = Sage.Platform.Application.ApplicationContext.Current.Services.Get&amp;lt;Sage.Platform.Data.IDataService&amp;gt;(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;System.Data.IDbConnection cnn = service.GetConnection(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;cnn.Open(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;System.Data.IDbCommand cmd = cnn.CreateCommand(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;string sql = &quot;select isnull(sum(case when datepart(dw,fecha_feriado)=1 or datepart(dw,fecha_feriado)=7 then 0 else 1 end),0)&quot;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;sql += &quot; from dias_feriados where fecha_feriado&amp;gt;=&#39;&quot; + Fi.ToString(&quot;MM/dd/yyyy&quot;) + &quot; 00:00:00&#39; and fecha_feriado&amp;lt;=&#39;&quot; + Ff.ToString(&quot;MM/dd/yyyy&quot;) + &quot; 24:00:00&#39;&quot;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;cmd.CommandText = sql; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;System.Data.IDataReader MyDataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection); &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;Int32 dias&amp;nbsp; = 0; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;while (MyDataReader.Read()) &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;dias = MyDataReader.GetInt32(0); &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;MyDataReader.Close(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;cnn.Close(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;cmd.Dispose(); &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return dias;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&amp;nbsp;&lt;/span&gt;
}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Esta función devuelve los días feriados no sábado y no domingo entre el rango de fechas.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Lo último que deben tomar en cuenta es que cuando hagan su programa, recuerden hacer que &lt;span style=&quot;color: #3d85c6;&quot;&gt;FechaInicial =&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;color: #3d85c6;&quot;&gt;DateAgregarLaborales(0, DateTime.Now())&lt;/span&gt; para que la fecha inicial también sea considerada.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;Por favor, si esta función les ayuda en su trabajo, hagan clic en los Ads que vean.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #3d85c6; font-size: x-small;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/5983259218419603606/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2010/10/sumar-solo-dias-laborales-en-c.html#comment-form' title='13 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/5983259218419603606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/5983259218419603606'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2010/10/sumar-solo-dias-laborales-en-c.html' title='Sumar sólo días laborales en C#'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-5440438949058203261</id><published>2010-09-07T14:11:00.000-07:00</published><updated>2010-09-07T14:16:55.717-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP"/><category scheme="http://www.blogger.com/atom/ns#" term="bloquear campo"/><category scheme="http://www.blogger.com/atom/ns#" term="bloquear registro"/><category scheme="http://www.blogger.com/atom/ns#" term="bloquear tabla"/><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="database"/><category scheme="http://www.blogger.com/atom/ns#" term="datos"/><category scheme="http://www.blogger.com/atom/ns#" term="distribución"/><category scheme="http://www.blogger.com/atom/ns#" term="FOR UPDATE"/><category scheme="http://www.blogger.com/atom/ns#" term="FOR UPDATE OF"/><category scheme="http://www.blogger.com/atom/ns#" term="IIS"/><category scheme="http://www.blogger.com/atom/ns#" term="net"/><category scheme="http://www.blogger.com/atom/ns#" term="NOWAIT"/><category scheme="http://www.blogger.com/atom/ns#" term="Oracle"/><category scheme="http://www.blogger.com/atom/ns#" term="procesamiento de datos"/><category scheme="http://www.blogger.com/atom/ns#" term="SELECT FOR UPDATE"/><category scheme="http://www.blogger.com/atom/ns#" term="SKIP LOCKED"/><category scheme="http://www.blogger.com/atom/ns#" term="vb"/><title type='text'>Transacciones en Oracle desde ASP con C#, distribución de datos</title><content type='html'>Reciéntemente me encontré con un requerimiento en un cliente donde se necesitaba que al presionar un botón, el sistema le trajera al usuario el siguiente registro que debía ser procesado.&lt;br /&gt;
&lt;br /&gt;
Para esta funcionalidad hay que considerar varios aspectos, como el hecho de que pueden haber 1 o N usuarios presionando el botón o que&amp;nbsp;los registros entregados nunca deben coincidir.&lt;br /&gt;
&lt;br /&gt;
Como estamos en IIS hay varias posibles soluciones, adicional, tenemos una consideración mucho más importante que hacer, y es que el cliente utiliza Oracle en su BD.&amp;nbsp; Este tipo de funcionalidad puede traer bloqueos (deadlocks), o dependiendo de la cantidad de usuarios, pueden degradar el performance de la aplicación Web a un punto frustrante.&lt;br /&gt;
&lt;br /&gt;
Para no alargar la historia, vamos directo a la solución.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Primero, yo he escogido marcar como bandera (flag) un campo de una tabla para descartar los que ya han sido actualizados, esta tabla la carga un supervisor y se la asigna a un grupo de usuarios, y en ese momento el campo viene en NULL.&amp;nbsp; Para sortear los problemas de bloqueo&amp;nbsp;utilizaremos un SELECT FOR UPDATE OF NOWAIT SKIP LOCKED.&lt;br /&gt;
&lt;br /&gt;
Ok, nos creamos una función en el Oracle:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;em&gt;create or replace FUNCTION BLOQUEADA(rid in rowid)&amp;nbsp; &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;
&lt;em&gt;return number&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;is&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;ret_id number := 0;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;pragma autonomous_transaction;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;begin&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;select 1 into ret_id from&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;TABLA&lt;/span&gt; where rowid = rid FOR UPDATE OF&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;CAMPOACTUALIZAR&lt;/span&gt; NOWAIT SKIP LOCKED;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;rollback;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;return 1;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;exception&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;when others then&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;if sqlcode = -54 then&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;rollback;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;return 0;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;else&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;raise;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;end if;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;end; &lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
Obviamente el FOR UPDATE nos hará un bloqueo (lock) de la tabla y&amp;nbsp;al definir OF le estamos diciendo al query que sólo queremos que bloquee el campo específico.&amp;nbsp; El NOWAIT evita que el query se quede &quot;pegado&quot; esperando a que otra actualización termine y el SKIP LOCKED hace que se salte los registros&amp;nbsp;que&amp;nbsp;están bloqueados.&amp;nbsp; El resto de la función es mandatorio para que todo funcione bien.&amp;nbsp; Importante recordar que el bloqueo sólo dura hasta el primer COMMIT.&lt;br /&gt;
&lt;br /&gt;
Luego, vamos al formulario donde queremos la funcionalidad, insertamos un botón (llamémosle Button1)&amp;nbsp;y le asociamos el siguiente código al evento click (aquí van a encontrar también, cómo crear una transacción, ejecutar múltiples sentencias para hacer commit al final, y muy importante, cómo conectarse a Oracle sin usar el famoso OracleClient Net Namespace o como se llame):&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;string LeeSiguiente = &quot;select &lt;span style=&quot;color: blue;&quot;&gt;ID_TABLA&lt;/span&gt; FROM &lt;span style=&quot;color: blue;&quot;&gt;TABLA&lt;/span&gt; where (nvl(&lt;span style=&quot;color: blue;&quot;&gt;CAMPOACTUALIZAR&lt;/span&gt;,&#39;-1&#39;) = &#39;-1&#39; OR (&lt;span style=&quot;color: blue;&quot;&gt;CAMPOACTUALIZAR&lt;/span&gt;=&#39;1&#39; AND (BLOQUEADA(rowid) = 1 and rownum = 1))) for update of &lt;span style=&quot;color: blue;&quot;&gt;CAMPOACTUALIZAR&lt;/span&gt; skip locked&quot;;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;string siguiente = &quot;SIGS&quot;;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;string LockSiguiente = &quot;UPDATE &lt;span style=&quot;color: blue;&quot;&gt;TABLA&lt;/span&gt; SET &lt;span style=&quot;color: blue;&quot;&gt;CAMPOACTUALIZAR&lt;/span&gt;=&#39;1&#39; WHERE &lt;span style=&quot;color: blue;&quot;&gt;ID_TABLA&lt;/span&gt; =&#39;$iguiente&#39;&quot;;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;// así nos conectamos a Oracle sin usar el OracleClient para NET&lt;/span&gt;System.Data.Common.DbProviderFactory dbf = System.Data.Common.DbProviderFactories.GetFactory(&quot;System.Data.OracleClient&quot;);&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;IDbConnection connection = dbf.CreateConnection();&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;connection.ConnectionString = &quot;Data Source=SERVICIOORACLE;Persist Security Info=True;User ID=USUARIO;Password=CLAVE;Unicode=True&quot;;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;// aquí se crea el comando y la transacción&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;IDbCommand command = connection.CreateCommand();&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;command.CommandType = CommandType.Text;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;IDbTransaction transaction = null;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;connection.Open();&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;// aquí comienza la transacción y asignamos el comando a la tranacción&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;transaction = connection.BeginTransaction();&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;command.Transaction = transaction;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;// ejecutamos el primer comando y verificamos si trae valores&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;command.CommandText = LeeSiguiente;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;siguiente=Convert.ToString(command.ExecuteScalar());&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;if (siguiente + &quot;$&quot; != &quot;$&quot; )&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;{&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;// ejecutamos el segundo comando&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;command.CommandText = LockSiguiente.Replace(&quot;$iguiente&quot;,siguiente);&lt;br /&gt;
command.ExecuteNonQuery();&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;} else {&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;siguiente = &quot;NO_HAY_MAS&quot;;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;} &lt;/em&gt;&lt;br /&gt;
&lt;em&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;// hacemos COMMIT lo cual termina la transacción&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;transaction.Commit();&lt;/em&gt;&lt;br /&gt;
&lt;em&gt;connection.Close();&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
Ok, con ese código, bloqueamos el siguiente registro disponible en la tabla, pero sólo 1!, traerá los registros instantaneamente en el campo &lt;span style=&quot;color: #6aa84f;&quot;&gt;&lt;strong&gt;siguiente&lt;/strong&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;,&amp;nbsp;y si no hay más disponibles, traerá el valor &quot;NO_HAY_MAS&quot; para que hagamos nuestras excepciones.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Espero este código les sirva de guía, porque cuando se requiere procesamiento de datos en paralelo, ya sea por usuarios, threads, etc, y en Oracle, es un verdadero problema encontrar una solución razonable.&lt;br /&gt;
&lt;br /&gt;
Recuerden hacer clic en los anuncios de Google!</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/5440438949058203261/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2010/09/transacciones-en-oracle-desde-asp-con-c.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/5440438949058203261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/5440438949058203261'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2010/09/transacciones-en-oracle-desde-asp-con-c.html' title='Transacciones en Oracle desde ASP con C#, distribución de datos'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-3387307713800071704</id><published>2010-09-07T07:59:00.000-07:00</published><updated>2010-09-07T13:01:21.831-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP"/><category scheme="http://www.blogger.com/atom/ns#" term="IIS"/><category scheme="http://www.blogger.com/atom/ns#" term="Metabase"/><title type='text'>IIS, Sin privilegios a la Metabase</title><content type='html'>Si en alguna&amp;nbsp;ocasión&amp;nbsp;tienen que&amp;nbsp;desarrollar algo montado sobre IIS y ASP, y&amp;nbsp;tienen la mala suerte de encontrarse con este error, pueden perder horas y horas de research, cuando en realidad la solución es muy simple:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Abren una ventana de comando.&lt;/li&gt;
&lt;li&gt;Se cambian al directorio &lt;strong&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\&lt;/span&gt;&lt;/strong&gt; (ojo si su Windows está en otro disco duro, por ejemplo D...).&lt;/li&gt;
&lt;li&gt;Ejecutan el comando &lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;strong&gt;aspnet_regiis -ga miusuario&lt;/strong&gt;&lt;/span&gt; (recuerden cambiar a miusuario por el usuario que está configurado en la página que están programando, o por el usuario que está &quot;impersonando&quot; el IIS).&lt;/li&gt;
&lt;li&gt;Ejecutan el comando&lt;span style=&quot;color: #0b5394;&quot;&gt; &lt;strong&gt;iisreset&lt;/strong&gt;&lt;/span&gt; y esperan a que termine para intentar nuevamente con su página.&lt;/li&gt;
&lt;/ol&gt;Sin mucho que analizar, está más que claro que el parámetro -ga significa &quot;grant access&quot;.&lt;br /&gt;
&lt;br /&gt;
Para que no se queden con las dudas, este error ocurre por algo muy sencillo:&amp;nbsp; instalaste tu IIS luego de haber instalado el NET Framework.&amp;nbsp; Anótenlo en algún lugar, primero instalar el IIS y luego el NET Framework.&lt;br /&gt;
&lt;br /&gt;
Con esto deben solucionar el problema y seguir con su desarrollo.</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/3387307713800071704/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2010/09/iis-sin-privilegios-la-metabase.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/3387307713800071704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/3387307713800071704'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2010/09/iis-sin-privilegios-la-metabase.html' title='IIS, Sin privilegios a la Metabase'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2519420594990276388.post-8428073627743677198</id><published>2010-09-06T14:37:00.000-07:00</published><updated>2010-09-07T07:36:12.067-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="crm"/><category scheme="http://www.blogger.com/atom/ns#" term="saleslogix"/><title type='text'>SalesLogix, dulce, complejo, indispensable...</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3ooekurH86g9GvFMzR8ue_hcQ7mSM4BzJbfKHTqmwspudH4oToaQFUlwbrSCGXP_Jlea08jruD2-II4KWV9THQsNHe9YwoDH7Zcn1ZQDi8YCTtBRqP-Dm6ADFPL0BprMKuQKHNVX04Us/s1600/saleslogix.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; ox=&quot;true&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3ooekurH86g9GvFMzR8ue_hcQ7mSM4BzJbfKHTqmwspudH4oToaQFUlwbrSCGXP_Jlea08jruD2-II4KWV9THQsNHe9YwoDH7Zcn1ZQDi8YCTtBRqP-Dm6ADFPL0BprMKuQKHNVX04Us/s320/saleslogix.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Esta es la herramienta que ADR Technologies promociona más en el área de centroamérica.&lt;br /&gt;
&lt;br /&gt;
Es un CRM que incorpora muchas ideas novedosas en este tipo de sistemas.&lt;br /&gt;
&lt;br /&gt;
Totalmente configurable y personalizable.&lt;br /&gt;
&lt;br /&gt;
Esta herramienta cuenta con sus propios IDE&#39;s, y es en su plataforma Web que quemo mis pestañas constantemente...&lt;br /&gt;
&lt;br /&gt;
Por el momento creo que será el tema principal de mis publicaciones.</content><link rel='replies' type='application/atom+xml' href='http://joseurenayi.blogspot.com/feeds/8428073627743677198/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://joseurenayi.blogspot.com/2010/09/saleslogix-dulce-pesadilla.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/8428073627743677198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2519420594990276388/posts/default/8428073627743677198'/><link rel='alternate' type='text/html' href='http://joseurenayi.blogspot.com/2010/09/saleslogix-dulce-pesadilla.html' title='SalesLogix, dulce, complejo, indispensable...'/><author><name>José Ureña</name><uri>http://www.blogger.com/profile/17411153189926164232</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3ooekurH86g9GvFMzR8ue_hcQ7mSM4BzJbfKHTqmwspudH4oToaQFUlwbrSCGXP_Jlea08jruD2-II4KWV9THQsNHe9YwoDH7Zcn1ZQDi8YCTtBRqP-Dm6ADFPL0BprMKuQKHNVX04Us/s72-c/saleslogix.jpg" height="72" width="72"/><thr:total>1</thr:total></entry></feed>