Búsqueda


Categorías

C# [15]
PHP [6]
Zend [1]
FileMaker [1]
.NET [6]
CVS [3]
General [9]
Javascript [2]
Paypal [1]
.NET Compact Framework [3]
C++ [1]
mysql [4]
Linux [1]

Últimos post

Dónde guardar los archivos de configuración en ClickOnce
phpinfo: Valores en error_reporting
Notes about Zend Server and Zend Studio setup
What's new in C# 4
Resolving a 'sticky tag is not a branch' error
Resumen del CodeCamp
CodeCamp Tarragona 2009
Acerca de la calidad del código
ClickOnce en Linux
Programando en PHP (y con CVS) en Visual Studio 2008

Sindicación

RSS 0.90
RSS 1.0
RSS 2.0
Atom 0.3

Dónde guardar los archivos de configuración en ClickOnce

ctg | 02 Noviembre, 2011 23:53

En ocasiones, las aplicaciones necesitan generar fichero de log o utlizar archivos de configuración, o simplemente necesitan acceder a bases de datos. En definitiva, necesitan acceder a cualquier recurso disponible y para ello deben tener algún tipo de información acerca del recurso en cuestión.
 
Como en una aplicación ClickOnce, cada versión es instalada en una carpeta aparte, no existe una forma automática de guardar y acceder a este tipo de recursos sin perder la información en cada actualización.
 
Por ello, si no se quiere perder el contenido de los ficheros, no queda más remedio que guardarlos fuera de la instalación de ClickOnce.
 
Si se esta utilizando Windows Vista o Windows 7, existen algunos lugares donde es posible guardar este tipo de ficheros. Por ejemplo, se pueden colocar en la carpeta Mis Documentos. Pero hay que tener cuidado, pues el usuario puede acceder a la infomación, consultarla  o incluso borrar ficheros.
 
Otra solución, más recomendada, es crear una carpeta dentro de Local Application Data dónde guardar todos los datos que la aplicación necesite.

Únicamente es necesario comprobar si existe o no la carpeta dónde se guardan los datos necesarios. Si la carpeta no existe (porque es la primera vez que se ejecuta el programa), será necesario crear la carpeta y guardar los archivos de configuración con unos valores por defecto.
 
Ejemplo:

string localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
string userFilePath = Path.Combine(localAppData, "MyCompany");
 
if (!Directory.Exists(userFilePath))
{
  Directory.CreateDirectory(userFilePath);

  // Create here your default config,log files
}
 
// Read config files

El único problema al utilizar este modo es en el momento en que el usuario desinstala la aplicación, quedándose todos los archivos en la carpeta Local Application Data sin desisntalar.

Publicado en C# . Comentario: (1). Retroenlaces:(0). Enlace

phpinfo: Valores en error_reporting

ctg | 18 Octubre, 2011 15:57

La información que aparece en phpinfo siempre es muy útil. Aunque a veces, la información no este muy "clara".

Por ejemplo, para saber el estado de error_reporting, aparece de la siguiente forma:

 

En error_reporting se encuentra el valor en decimal, en vez de mostrar de una forma más concisa que valores se estan utilizando.

En ocasiones, no se puede acceder de manera fácil a php.ini (permisos, etc) Por eso, he puesto los valores de las constantes de error de PHP.
 
E_RECOVERABLE_ERROR = 4096
E_USER_NOTICE = 1024
E_USER_WARNING = 512
E_USER_ERROR = 256
E_COMPILE_WARNING = 128
E_COMPILE_ERROR = 64
E_CORE_WARNING = 32
E_CORE_ERROR = 16
E_NOTICE = 8
E_PARSE = 4
E_WARNING = 2
E_ERROR = 1
 
E_ALL = 6143 = 1011111111111

 
Ejemplos:

E_ALL & ~E_NOTICE = 6143 – 8 = 6135
E_ALL & ~E_NOTICE & ~E_WARNING = 6143 – 8 - 2 = 6133

Publicado en PHP . Comentario: (0). Retroenlaces:(0). Enlace

Notes about Zend Server and Zend Studio setup

ctg | 13 Octubre, 2011 17:09

I just drop a few lines about Zend Server and Zend Studio setup to avoid problems next time I will need install them again.

1) Always install Zend Server first. Also, make sure phpMyAdmin and mySQL are selected on setup

2) Only if you use Skype. It uses 80 port. To avoid problems, choose 8080 instead on Zend Server setup

3) After setup, modify next line on httpd.conf (usally on C:\Program Files (x86)\Zend\Apache2\conf).

To do this you need be Adminstrator or run a editor program as "Run as Administrator"
    * Uncomment next line (by default is commented):

        Include conf/extra/httpd-vhosts.conf


4) Modify httpd-vhosts.conf (usually on C:\Program Files (x86)\Zend\Apache2\conf\extra) file


    * Comment all 'NameVirtualHost *:80' samples, like this:
        # Use name-based virtual hosting.
        #
        #NameVirtualHost *:80
        #
        # VirtualHost example:
        # Almost any Apache directive may go into a VirtualHost container.
        # The first VirtualHost section is used for all requests that do not
        # match a ServerName or ServerAlias in any <VirtualHost> block.
        #
        #<VirtualHost *:80>
        #    ServerAdmin webmaster@dummy-host.example.com
        #        DocumentRoot "C:\Program Files (x86)\Zend\Apache2/docs/dummy-host.example.com"
        #        ServerName dummy-host.example.com
        #        ServerAlias www.dummy-host.example.com
        #        ErrorLog "logs/dummy-host.example.com-error.log"
        #      CustomLog "logs/dummy-host.example.com-access.log" common
        #</VirtualHost>
        #<VirtualHost *:80>
        #    ServerAdmin webmaster@dummy-host2.example.com
        #      DocumentRoot "C:\Program Files (x86)\Zend\Apache2/docs/dummy-host2.example.com"
        #    ServerName dummy-host2.example.com
        #    ErrorLog "logs/dummy-host2.example.com-error.log"
        #    CustomLog "logs/dummy-host2.example.com-access.log" common
        #</VirtualHost>

    * Add next text at the bottom of the file and modify DocumentRoot,ErrorLog... directories using your computer values

    * Note: I used

        Listen 10082
        NameVirtualHost *:10082
        <VirtualHost *:10082>
             Options Indexes FollowSymLinks
             DocumentRoot "C:\Users\Cristobal\Documents\CVSDATA"
             ErrorLog "C:\Users\Cristobal\Documents\CVSDATA\amex\jshop\admin\php_error.log"
             LogLevel notice
         <Directory "C:\Users\Cristobal\Documents\CVSDATA">
             AllowOverride All
              Order allow,deny
              Allow from 127.0.0.1
         </Directory>
        </VirtualHost>

5) If you need PEAR click on http://www.livelywebdesign.com/blog/2011/07/installing-pear-after-zend-server/

Publicado en Zend . Comentario: (0). Retroenlaces:(0). Enlace

What's new in C# 4

ctg | 04 Mayo, 2010 13:15

2 years ago, Stuart Celarier made a set of short webcast about new languages features in C# 2.0 in .NET 2.0.

.NET Framework 4 was released on 12th April and new version with C# 4.0 was included on it.

A new 'What's new ...' webcast had been done to introducing new C# 4.0 features and describes them.

You can find all webcast (including old ones) on Channel 9

Publicado en C#, .NET . Comentario: (0). Retroenlaces:(0). Enlace

Resolving a 'sticky tag is not a branch' error

ctg | 23 Noviembre, 2009 18:54

Sometimes we got a CVS error message like that:

cvs commit: warning: unrecognized response `Started a shell/command' from cvs server
cvs server: sticky tag `VERSION_1_2' for file `Program.cs' is not a branch
cvs [server aborted]: correct above errors first!
Error, CVS operation failed

That's due probably you checked out a tag rather than a branch. Remember, you can only check in code against a branch, not a tag.

Is usual make a branch when code changes to a new release version (eg: from 1.3 to 2.0, branch names MY_PRODUCT_1_0 and MY_PRODUCT_2_0). But also is very often put a tag name similar to branch name (eg: Branch name: MY_PRODUCT_2_0, Tag Name: MY_PRODUCT_2_0_2).

Using this convention name, tag name MY_PRODUCT_2_0_2 indicates a version 2.0.2 of the file. For example, Drupal follow this rules and here you can find how solve similar CVS problems.

Then, the solution is easy. You should make sure to check out a branch. CVS automatically update your code with latest code on this branch.

Take a look next screenshot if you use Tortoise CVS to get a latest code from a branch:

CVS, how to update from a branch

 

Publicado en CVS . Comentario: (0). Retroenlaces:(0). Enlace

Resumen del CodeCamp

ctg | 21 Octubre, 2009 23:37

Aunque todavía estoy "digeriendo" toda la información del Codecamp, creo que ya es hora de al menos... ordenar las ideas y reportar "feedback" a los organizadores.

Primero, antes de todo, felicitar a los organizadores, y por mi parte a Marc Rubiño, quien en todo momento me tuvo informado de los ponentes y sus sesiones.

Personalmente
, no puedo quejarme absolutamente de nada. He conocido a mucha gente y a la vez poder hablar con los ponentes "cara a cara" en vez de e-mail.

Aquí dejo las sesiones que más me gustaron:
Quizás el único aspecto negativo a destacar por mi parte fue la webcast con Lisa Feigenbaum, que se acabo antes de tiempo por culpa de la pésima conexión a internet que ofrecía el hotel.

A las que no pude ir porque eran a la misma hora
Afortunadamente, todas las sesiones se grabaron y estarán disponibles en breve.

¿Para cuando el próximo?

Publicado en General . Comentario: (0). Retroenlaces:(0). Enlace

CodeCamp Tarragona 2009

ctg | 02 Octubre, 2009 14:33

Dentro de un par de semanas se celebrará el CodeCamp 2009.  Será un evento gratuito dónde se podrá conocer a los profesionales,usuarios y aficionados a la tecnologia .NET y Mono.

 Code camp 2009 Banner 1

 Code 2009 Banner 2


 

Publicado en General . Comentario: (1). Retroenlaces:(0). Enlace

Acerca de la calidad del código

ctg | 08 Junio, 2009 16:33

La mayoría de los programadores estarán de acuerdo con las siguientes afirmaciones:

Publicado en General . Comentario: (0). Retroenlaces:(0). Enlace

ClickOnce en Linux

ctg | 07 Abril, 2009 11:55

No voy a hablar de las ventajas de ClickOnce. Resumiendo, el objetivo de ClickOnce es facilitar las instalaciones y actualizaciones de programas con el mínimo impacto en la máquina del usuario. Aunque funciona a la perfección en servidores IIS, es necesario realizar ciertos cambios en un servidor Linux.

Para trabajar más cómodamente en servidores Linux, mejor subir nuestros paquetes por FTP. El único problema es que cada vez que publiquemos una nueva versión, se tendrá que teclear el password de acceso al FTP. Por ejemplo: ftp://ftp.misitio.com/htdocs/www/ClickOnce/. La URL de instalación, será entonces en nuestro ejemplo http://www.misitio.com/ClickOnce/

El último paso es configurar el servidor Apache para que reconozca las extensiones ClickOnce: .application, .manifest y .deploy. Para ello, en la carpeta del servidor web dónde se han subido los paquetes, es necesario crear un fichero .htaccess con las siguientes líneas:

AddType application/x-ms-application application
AddType application/x-ms-application manifest
AddType application/octet-stream deploy


Además, si nuestro paquete incluye alguna DLL también se tendrá que añadir la siguiente línea:

AddType application/x-msdownload dll

Publicado en .NET . Comentario: (0). Retroenlaces:(0). Enlace

Programando en PHP (y con CVS) en Visual Studio 2008

ctg | 06 Abril, 2009 18:27

Después de pasar más de 3 años utilizando Zend Studio y antes de realizar el cambio a Eclipse que tarde o temprano tendré que realizar, decidí a finales del 2008 perder un poco de tiempo en intentar que Visual Studio 2008 fuera mi principal editor tanto para código C# y también de PHP, Javascript y HTML/CSS.

Además de Zend Studio para mis desarrollos en PHP, utilizaba diferentes add-on según el navegador para depurar código Javascript. Y para editar HTML, hojas de estilo usaba Dreamweaver. A todo esto, se suma nuestro controlador de versiones, que todavía sigue siendo CVS (si funciona bien porque tocarlo), pues tenemos código del siglo pasado :P y utilizamos TortoiseCVS para trabajar más cómodamente.

En resumen, muchas de herramientas para realizar el trabajo diario.

La versión 2005 de Visual Studio ya me permitía realizar la mayoría de las tareas mencionadas anteriormente pero fue en la versión 2008 en donde por fin el editor de HTML/CSS funcionaba decentemente (el mismo que incluía Expression Blend), se añadió un depurador para Javascript, snippets, split view ...

Para poder editar PHP, con coloración de código, Intellisense, depuración y otras características, he utilizado PHP IDE - VS.Php for Visual Studio. Se integra perfectamente con Visual Studio y creo que tiene algo que ver con el proyecto descontinuado Php for Visual Studio (Php4VS) de Codeplex porque ellos mismos lo recomiendan.

Y para poder utilizar CVS desde Visual Studio, he utilizado TamTam CVS SCC, que permite realizar las tareas más habituales, es decir, check-in/check-out, diferencias, histórico...Desde principios de año utilizo PHP como editor de código con CVS y la experiencia ha sido muy positiva y productiva, al tener en un solo producto las herramientas que necesito para mi trabajo diario.

 

Publicado en General, Javascript, PHP, .NET . Comentario: (0). Retroenlaces:(0). Enlace

VS & VB Spanish Tour 2008

ctg | 18 Noviembre, 2008 13:39

Ayer asistí al VS & VB Spanish Tour 2008, donde pude conocer personalmente a Lisa Feigenbaum, Jonathan Aneja y Pep Lluis Blano.

Las dos conferencias estuvieron muy bien. Jonathan Aneja muestra unos ejemplos muy claros e instructivos sobre las novedades de Visual Basic 9 (y por ello también aplicables a C# 3.0). Y mucho más espectacular fue la charla de Lisa, donde mostro lo fácil que es hacer refactoring, trabajar con snippets, corrección de errores y varias técnicas para ser mucho más productivo a la hora de realizar nuestro trabajo.

Recomiendo todas las personas que puedan asistir a las charlas que lo hagan, pues durante esta semana estan realizando un tour por varias provincias españolas.

Many thanks to Jonathan and Lisa for your time after conference. I hope you enjoyed this short stay in Tarragona... and Happy Birthday Lisa !!!!

Publicado en C#, .NET . Comentario: (0). Retroenlaces:(0). Enlace

Crear archivo Excel desde C#

ctg | 08 Septiembre, 2008 22:33

Aunque Microsoft Excel es capaz de interpretar ficheros separados por comas (*.csv), también es posible generar un fichero Excel (*.xls) desde C# utilizando Interop. De este modo, se podrán utilizar funciones como autosuma o simplemente cambiar ciertos aspectos de una determinada celda.

El único problema, es que es necesario que el ordenador tenga instalado Microsoft Office (XP, 2003 ó 2007) asegurándose que la opción ".NET Programmability support" esté seleccionada. Si se ha seleccionado instalación Completa (en Microsoft Office), no hace falta preocuparse por nada por se tuvo que instalar.

Aunque no lo he probado, pero puede ser que una versión reducida de Office (instalación mínima) junto con Redistributable Primary Interop Assemblies sea posible crear XLS desde código .NET.

En este enlace, (http://msdn.microsoft.com/en-us/library/aa159923.aspx) informa de varias formas de instalar y usar Office 2003 para usar Interop.

Para crear un fichero XLS, desde un proyecto Windows de C#, añadir una referencia a Microsoft xx.0 Object Library que la encontrarás en la pestaña COM. Si utilizas Microsoft Office XP ó 2003, la versión será la 11.0. En cambio, con Office 2007, la versión es la 12.0. Es puede ser una fuente de problemas y por ello es importante prestar atención a la versión porque ciertos tipos no son compatibles unos con otros.

Dentro del espacio de nombres Microsoft.Office.Interop.Excel se encuentra todo lo necesario para poder crear el fichero Excel. Dejo aquí un pequeño ejemplo de una simple clase para ayudarme a crear ficheros XLS, para poder "acordarme" en un futuro...

using System;
using Microsoft.Office.Interop;
using System.Reflection;
using MyExcel = Microsoft.Office.Interop.Excel;

// Use this class to create a Microsoft Excel (*.xls) file
// Please, read this notes
// Microsoft Office XP, 2003 or 2007 must be installed on target computer to create *.xls file.
// VERY IMPORTANT: Office Primary Interop Assemblies (PIA) must be selected on Microsoft Office installation. Use "Complete installation" in Office setup
// http://msdn.microsoft.com/en-us/library/kh3965hw(VS.80).aspx
//
// Add Microsoft Excel Library xx.0 (Microsoft.Office.Interop.Excel.dll) reference on COM tab
// Also VERY IMPORTANT
// Double check Microsoft Excel Library version. 11.0 = Office 2003, 12.0 = Office 2007. Certain types are NOT compatibles!!!


public class ExcelFile : IDisposable
{
MyExcel.Application theExcel = null;
MyExcel.Workbook theWorkbook = null;
string theExcelFileName;

public ExcelFile(string fileName)
{
    theExcel = new MyExcel.Application();
    theWorkbook = theExcel.Workbooks.Add(System.Reflection.Missing.Value);
    theExcelFileName = fileName;
}

~ExcelFile()
{
    Dispose(false);
}

public void AddSheet(string sheetName)
{
    var newSheet = (MyExcel.Worksheet)theWorkbook.Sheets.Add(Missing.Value, Missing.Value, 1, MyExcel.XlSheetType.xlWorksheet);
    newSheet.Name = sheetName;
}

public void SetCell(int row, int column, string text)
{
    SetCell(null, row, column, text);
}

public void SetCell(string sheetName, int row, int column, string text)
{
    
    MyExcel.Worksheet theSheet = (null == sheetName ? (MyExcel.Worksheet) theWorkbook.ActiveSheet : (MyExcel.Worksheet)theWorkbook.Sheets[sheetName]);
    theSheet.Cells[row, column] = text;
}

public void Close()
{
    Dispose(true);
}

private void Dispose(bool disposing)
{
    if(disposing)
    {
        theWorkbook.SaveAs(theExcelFileName, MyExcel.XlFileFormat.xlExcel7, Missing.Value, Missing.Value, Missing.Value, Missing.Value, MyExcel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, null);
        theWorkbook.Close(false, Missing.Value, Missing.Value);
        theExcel.Quit();
    }
}

void IDisposable.Dispose()
{
    Dispose(true);
}
}

Publicado en C# . Comentario: (5). Retroenlaces:(0). Enlace

10 consejos a la hora de diseñar tú página web

ctg | 23 Julio, 2008 00:42

  1. El usuario de una página web mira por primera vez la parte superior izquierda. Y poco a poco van bajando y van centrado su mirada y acaban observando muy brevemente el lado derecho.
  2. Por ello, un buen lugar para colocar la publicidad es la parte superior izquierda.
  3. Los títulos deben ser claros y cortos.
  4. Evitar artículos largos o bloques de texto muy largos.
  5. Utilizar listas o puntos para enumerar algo.
  6. Cuando necesites poner una cantidad, utiliza números, nunca texto.
  7. Los menus, deben estar situados en la parte superior o en la izquierda, como se dijo en el punto 1.
  8. El texto con la fuente tipo "Comic Sans" no son leídas por el usuario excepto en el caso que la página este pensada para el público infantil.
  9. La mayoría de banners gráfico son ignorados por el usuario.
  10. Las imágenes relacionadas con la página en cuestión siempre son útiles y a ser posible, grandes.

Publicado en General . Comentario: (0). Retroenlaces:(0). Enlace

Make a beep using internal PC speaker using C#

ctg | 17 Julio, 2008 23:56

Some computers doesn't enable sound card or simply, doesn't have it.

If you want make a beep to force to user to pay attention you can also use P/Invoke to call Beep funciton on Kernel32.dll.

It takes two arguments, the first one the frequency, and the second one the duration and returns a bool for success.

Frequency must be from 37 to 32,767.

using System.Runtime.InteropServices;

public class Foo
{
    [DllImport("Kernel32.dll")]
    public static extern bool Beep(UInt32 frequency, UInt32 duration);

    public static void beepTime()
    {
        Beep(1000, 300);
        System.Threading.Thread.Sleep(300);
        Beep(2000, 400);
        System.Threading.Thread.Sleep(300);
        Beep(500, 200);
        System.Threading.Thread.Sleep(300);
    }
}

Publicado en C# . Comentario: (0). Retroenlaces:(0). Enlace

Get more 100 matched results using Paypal TransactionSearch

ctg | 07 Julio, 2008 14:11

One of the main problems using TransactionSearch on Paypal API is only returns last 100 records. In this case, TransactionSearch returns a SuccessWithWarning ack to indicate this problem.
To fix it, I made a code to get the status of one day transactions doing a "hack" to avoid 100 records problem.

// Sets user, password and signature
UserIdPasswordType user = new UserIdPasswordType();
user.Username = this.user;
user.Password = this.password;
user.Signature = this.signature;

// Define TransactionSearchResponseType. Inside loop we add params to adjust search
TransactionSearchResponseType transactionSearchResponseType = null;

// Paypal only can get 100 results at time.
do
{
    // Prepare the interface with user
    using (PayPalAPISoapBinding paypalInterfaceSearch = new PayPalAPISoapBinding())
    {
        paypalInterfaceSearch.RequesterCredentials = new CustomSecurityHeaderType();
        paypalInterfaceSearch.Url = "https://api-3t.paypal.com/2.0/";
        paypalInterfaceSearch.RequesterCredentials.Credentials = user;
    
        // Prepare TransactionSearch request
        TransactionSearchRequestType transactionSearchRequestType = new TransactionSearchRequestType();
        transactionSearchRequestType.Version = "3.2";
        transactionSearchRequestType.TransactionClass = PaymentTransactionClassCodeType.All;
        transactionSearchRequestType.TransactionClassSpecified = true;
    
        // Adjust the dates according is in loop or not
        if (null != transactionSearchResponseType)
        {
            // StartDate always is 0:00:00 hours
            transactionSearchRequestType.StartDate = new DateTime(
            transactionSearchResponseType.PaymentTransactions[99].Timestamp.Year,
            transactionSearchResponseType.PaymentTransactions[99].Timestamp.Month,
            transactionSearchResponseType.PaymentTransactions[99].Timestamp.Day,
            0, 0, 0);
            // EndDate is last PaymentTransactions less 1 second. This way we obtain left results
            transactionSearchRequestType.EndDate = transactionSearchResponseType.PaymentTransactions[99].Timestamp;
            transactionSearchRequestType.EndDate.AddSeconds(-1);
        }
        else
        {
            transactionSearchRequestType.StartDate = startDate;
            transactionSearchRequestType.EndDate = endDate;

            if (startDate == endDate)
            {
                transactionSearchRequestType.EndDate = transactionSearchRequestType.EndDate.AddDays(1);
            }
        }
        transactionSearchRequestType.EndDateSpecified = true;

        TransactionSearchReq transactionSearchRequest = new TransactionSearchReq();
        transactionSearchRequest.TransactionSearchRequest = transactionSearchRequestType;

        // Get results and Ack
        transactionSearchResponseType = paypalInterfaceSearch.TransactionSearch(transactionSearchRequest);

        // Check Ack, if OK, get results
        if (AckCodeType.Success == transactionSearchResponseType.Ack || AckCodeType.SuccessWithWarning == transactionSearchResponseType.Ack)
        {
            if (null != transactionSearchResponseType.PaymentTransactions)
            {
                foreach (PaymentTransactionSearchResultType paymentTransactionSearchResultType in transactionSearchResponseType.PaymentTransactions)
                {
                    // PaymentTransaction only include PayPal TransactionID. To get JShop order number it's necessary get more details using TransactionID

                    // Its necessary prepare again the interface if not fails.
                    using(PayPalAPISoapBinding paypalInterfaceDetails = new PayPalAPISoapBinding())
                    {
                        paypalInterfaceDetails.RequesterCredentials = new CustomSecurityHeaderType();
                        paypalInterfaceDetails.Url = "https://api-3t.paypal.com/2.0/";
                        paypalInterfaceDetails.RequesterCredentials.Credentials = user;

                        // Prepare TransactionDetails
                        GetTransactionDetailsRequestType transactionDetailsRequesType = new GetTransactionDetailsRequestType();
                        transactionDetailsRequesType.Version = "3.2";
                        transactionDetailsRequesType.TransactionID = paymentTransactionSearchResultType.TransactionID;      // Set TransactionID to search

                        GetTransactionDetailsReq transactionDetailsRequest = new GetTransactionDetailsReq();
                        transactionDetailsRequest.GetTransactionDetailsRequest = transactionDetailsRequesType;

                        // Get results
                        GetTransactionDetailsResponseType transactionDetailsResponseType = paypalInterfaceDetails.GetTransactionDetails(transactionDetailsRequest);

                        if (AckCodeType.Success == transactionDetailsResponseType.Ack)
                        {
                            if (null != transactionDetailsResponseType)
                            {
                                // Check paymentTransactionSearchResultType to see the transaction status
                            }
                        }
                        else
                        {
                // Log message here. TransactionDetailsResponseType not successful searching TransactionID
                        }
                    }
                }
            }
            else
            {
        // Log message here. TransactionSearchResponseType not sucessful
            }
        }
    }
} while (transactionSearchResponseType.Ack == AckCodeType.SuccessWithWarning);

 

Publicado en C#, Paypal . Comentario: (0). Retroenlaces:(0). Enlace