Pliki cookie pomagają nam udostępniać nasze usługi. Korzystając z tych usług, zgadzasz się na użycie plików cookie. Więcej informacji
Shoper.pl - aktualizacja kartotek za pomocą API i arkusza kalkulacyjnego. Część 2.

2014-09-26

Najczęściej wykonywaną czynnością w obsłudze sklepu internetowego, poza realizacją zamówień, jest aktualizacja listy oferowanych produktów.

Sz@rk Biznes ma w tym zakresie wbudowane mechanizmy opisane już na naszych stronach:

Ostatni dokument opisuje sposób bezpośredniego ładowania wybranej kategorii produktów wprost do arkusza kalkulacyjnego, a po zmianie cen produktów, automatyczną aktualizację w sklepie. Metoda taka, będzie jednak nadal wymagała ładowania i szukania kolejnych kartotek, jeżeli chcemy zaktualizować produkty wg "określonego klucza", tzn. tylko niektóre kartoteki muszą być zmienione.

Spotykamy się też często z arkuszami Excel lub plikami CSV otrzymywanymi od naszych dostawców, których produkty oferujemy w swoich sklepach. Arkusze takie mogą zawierać nowe dane, które należy wprowadzić w sklepie. Taką czynność możemy wykonać tylko ręcznie, albo za pomocą specjalistycznego oprogramowania.

W tym dokumencie przedstawimy sposób zautomatyzowania wybiórczej aktualizacji z wykorzystaniem właśnie arkusza kalkulacyjnego. Proszę zapoznać się wcześniej z pierwszą częścią tego dokumentu.


Zakładka [C# code] zawiera kod do aktualizacji cen w sklepie.


Lista produktów Shoper. Kolorem żółtym zaznaczono pozycje, które będą zmienione.


Ładujemy do arkusza dokument zawierający niezbędne dane.

W naszym przykładzie w pierwszej kolumnie znajduje się ID produktu, w drugiej nowa cena. Wykonujemy własny skrypt C#. W trakcie aktualizacji program wpisze do kolumny „D” cenę która obowiązywała przed zmianą.


Widok arkusza po wykonaniu zadania. W ostatniej kolumnie program wpisał starą cenę pobraną bezpośrednio ze sklepu.


Widok listy produktów sklepu po odświeżeniu listy. Tylko wybrane ceny zostały zmienione.



Widok tych samych produktów w panelu administratora sklepu.


W rzeczywistych warunkach możemy dodatkowo aktualizować inne kolumny, a układ danych w arkuszu może być w odmiennym formacie. Zawsze jednak wykonywany skrypt musi być odpowiednio dopasowany do właściwego arkusza. Zmiana nie powinna być trudna nawet dla początkującego programisty. Proszę zapoznać się z załączonym poniżej przykładowym kodem.

W przykładzie dodaliśmy tylko jeden przycisk do MENU. Użytkownik może jednak definiować więcej akcji i przycisków dostosowanych do własnych potrzeb.


namespace Szark
{
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using DevExpress.Spreadsheet;
    using TGSoft.UI;
    using TGSoft.Utils;

    public partial class Form1 : DevExpress.XtraEditors.XtraForm
    {
        private SSController controller;

        public Form1(SSController sender)
        {
            this.InitializeComponent();
            controller = sender;
            simpleButton1.Click += simpleButton1_click;
        }

        public void Main()
        {
            this.ShowDialog();
        }

        private void simpleButton1_click(object sender, EventArgs e)
        {
            var iApi = TGSoft.Data.Shoper.ApiManager.GetApi(1);
            var product = new TGSoft.Data.Shoper.Products()
                {
                    Engine = iApi.Api,
                    AutoUpdateOnPost = true
                };
            
            Worksheet ws = controller.ActiveWorksheet;
            Range r = ws.GetUsedRange();
            double id, price;
            controller.BeginUpdate();
            for (int i = 1; i < r.RowCount; i++)
            {
                if (r[i, 0].Value.IsEmpty)
                    return;
                
                id = r[i, 0].Value.NumericValue;
                product.Open(id);
                if (product.RecordCount == 1)
                {
                    // stara cena
                    price = product.FieldByName("price").ToDouble();
                    r[i, 3].SetValue(price);
                    // nowa cena
                    price = r[i, 1].Value.NumericValue;
                    product.Edit();
                    product.FieldByName("price", price);
                    product.Post();
                }
            }
            controller.EndUpdate();
            Close();
        }
    }
}