Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz

  Gelişmiş Arama
insanın içinde varsa, commodore.gen.tr açığa çıkarır bunu.. bir nevi retro olaylarının dolunayıyız.(Arda)
Sayfa: [1]   Aşağı git
Yazdır
Gönderen Konu: Excel ve SQL Yardım  (Okunma Sayısı 2574 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
programci42
Üye
***
Mesaj Sayısı: 196


Üyelik Bilgileri
« : Ekim 05, 2020, 18:02:25 ÖS »

Arkdaşlar merhaba şöyle bir sıkıntım var yardımcı olursanız sevinirim.

1 tane excel dosyamız var ve bu excel dosyamız sürekli güncelleniyor arkadaşlar bu exceli elle giriyorlar sonra ağda paylaşımda yazma yetkisi olan sadece kayıt ekleyip çıkarıyor veya değiştiriyor diğer tüm kullanıcılar sadece okuma yetkisine sahip.

Sorum şu bu excelden bağımsız bir programımız var kendim tasarladığım aynı bilgiler programda da var bu programa da insanlar kendileri kayıt giriyorlar.

İnsanların hem excele hem de programa girdiği veriler aynı bir fark yok.

Dedik ki excelde zaten hazır kayıtlar ve sürekli güncelleniyor programdaki bu yeni kayıt oluşturma işini iptal edelim ve bu kayıtları excelden çeksin hem kayıt giren arkadaşlar yeni kayıt açmakla uğraşmaz hem de hatalı veri girişini önlemiş oluruz dedik.

Ama işte şöyle bir sorun var excelde sütunun birine veriler sayısal olarak girilmiş daha sonra alt satırlarda metin olarak girilmiş bu yüzden programla oldb ile excele bağlanıp tüm kayıtları çektiğim zaman ilk satırlarda veri sayısal olarak girildiği için alttaki metin olan kayıtlardaki sütun null olarak geliyor bunu nasıl çözebiliriz?

Yaptığım denemeler

- Bu sayısal kayıtlar zaten çok eski silinmesinde bir sakınca yok elle silmek istedim fakat excel dosyasının boyutu 20 MB birden fazla sayfa var ve sayfalar arası bağlantı da var silmeye çalıştığımda ise "bu işlem için yeterli bellek yok" hatasını verdi ama bilgisayarda 8,5 GB RAM var nasıl yetmez kıytırık bir excel için?

- Bu olmayınca kodla sileyim dedim sql oldb olarak bağlanıp DELETE komutunu çalıtşrdım fakat bunda da "Bağlanmış tabloda veri silinmesi bu ISAM tarafından desteklenmiyor."
hatasını verdi yine silinmedi.

- Sorguladığım veriler üzerinde CSTR komutunu kullanıp tüm verileri metinsel olarak almasını ve null veri gelmemesini istedim ancak bu da yemedi.

- Excele oldb olmadan api olarak bağlanıp verileri çekip yazdırmayı dene demeyin çünkü çok aşırı yavaş çalışıyor ve sistemi aşırı zorluyor.

- Bu arada yazmayı unuttum onu yazıyorum, exceli açıp o sütunun veri tipini Metin yaptım yine olmadı.

Başka sizin önerileriniz nedir?
« Son Düzenleme: Ekim 05, 2020, 18:49:20 ÖS Gönderen: programci42 » Logged
ogün
Üye
***
Mesaj Sayısı: 209



Üyelik Bilgileri
« Yanıtla #1 : Ekim 05, 2020, 22:34:42 ÖS »

Libreoffice yazılımını yükleyip denediğiniz silme gibi işlemleri birde onun üzerinden deneyebilirsiniz. Bellek hatası gibi hataları vermeyebilir.
Logged
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.727


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #2 : Ekim 06, 2020, 09:04:08 ÖÖ »

    Dedik ki excelde zaten hazır kayıtlar ve sürekli güncelleniyor programdaki bu yeni kayıt oluşturma işini iptal edelim ve bu kayıtları excelden çeksin hem kayıt giren arkadaşlar yeni kayıt açmakla uğraşmaz hem de hatalı veri girişini önlemiş oluruz dedik.

    Veri girişini Excel ortamındaki verileri çekerek yaptığınızda, datalar ilk başta kontrolsüz olarak girileceği için hatalı veriyle karşılaşma ihtimaliniz çok yüksek. Bu yüzden tavsiye etmem. Hatalı girişleri azaltmak için Excel tarafında validation rule, veri çekerken de kontrol sorguları kullanmanızı tavsiye edebilirim.

    Alıntı
    Bu sayısal kayıtlar zaten çok eski silinmesinde bir sakınca yok elle silmek istedim fakat excel dosyasının boyutu 20 MB birden fazla sayfa var ve sayfalar arası bağlantı da var silmeye çalıştığımda ise "bu işlem için yeterli bellek yok" hatasını verdi ama bilgisayarda 8,5 GB RAM var nasıl yetmez kıytırık bir excel için?

    * Bu verileri excel'in filtre özelliğini kullanarak silebilirsiniz. (greater than 0 filtresi sadece numeric alanları seçiyor.)

    * Hatalı verileri "conditional delete" makrosuyla silebilirsiniz. Nette çok örneği var. Excel'le haşır neşir olan herkese tavsiye ettiğim ASAP Utilities içinde de var.

    * Hatalı verileri mutlaka silmek gerekiyor mu? Sadece veri tabanına yazmasak olmaz mı?

    * Excel'in 64bit versiyonunu deneyebilirsiniz. Bellek limitleri daha yüksek olması lazım.[/list]
    Logged

    Theoden (CYON4D)
    Deneyimli
    *****
    Mesaj Sayısı: 1.758



    Üyelik Bilgileri WWW
    « Yanıtla #3 : Ekim 06, 2020, 10:58:46 ÖÖ »

    C# ile Excel işlemleri nispeten basit bir şekilde yapılabiliyor. Ben bazı eski projelerde kullanmıştım.
    C# örnekleri şu linkte var: http://csharp.net-informations.com/excel/csharp-read-excel.htm

    İstenen Excel satırlarını silmek için:

    Kod:
    ApplicationClass excel = new ApplicationClass();
    Microsoft.Office.Interop.Excel.Range cel = (Range)excel.Cells[rowIndex, columnIndex];
    cel.Delete();

    Türü string olan excel hücresinin içindeki veri sayısal mı? Yani türü string olsa da mesela "10" şeklinde mi yazılmış?
    Eğer sayısal veri string olarak kaydedilmişse basitçe dönüştürülebilir.

    Kod:
    Ör: int sayi = Convert.ToInt32(Excel.Cell.Value);

    Ayrıca Excel sütun veri tipini şu şekilde alabiliriz:

    Kod:
    Type type = worksheet.Cells[1,1].Value.GetType();
    Logged

    Altan Özdemir
    Yeni Üye
    *
    Mesaj Sayısı: 4


    Üyelik Bilgileri
    « Yanıtla #4 : Ekim 06, 2020, 12:22:36 ÖS »

    Bence sizin izlediğiniz yolda sorun var , sizin yerinizde olsam (ki daha önce oldum) Exceli ana kaynak olarak bir kere içeri alır sonra alın size program artık buradan devam edin derdim. Ağ üzerinde herkese de program üzerinde yetki verin geçin .  İnsanlar alıştıkları şeyleri ilk başlarda bırakmak istemezler ama er ya da geç alışırlar , bir süre sonra nadiren de olsa excel olsa tak tak kopyala yapıştır yapardım dediklerini duyarsınız

    yine de bu yoldan devam edeceksiniz Epplus kütüphanesi ile çok hızlı bir şekilde alanın içeriğini silebilirsiniz ;
    Kod:
    ExcelPackage package = new ExcelPackage(); 
     
    ExcelWorksheet ws = package.Workbook.Worksheets["Sheet2"]; 
     
    ws.Cells["A24:C36"].Clear();
    Bu kütüphaneyi incelemenizi tavsiye ederim
    Logged
    programci42
    Üye
    ***
    Mesaj Sayısı: 196


    Üyelik Bilgileri
    « Yanıtla #5 : Ekim 06, 2020, 12:42:56 ÖS »

    Arkadaşlar çok teşekkür ederim hepinize gerçekten.

    Şöyle bir sıkıntımız var bu excel aslında başka bir firmaya ait ve bize o firmadan geliyor öyle söyleyeyim yani size daha iyi anlamanız için excelde herhangi bir değişiklik yapma yetkimiz yok bu excel sadece 1 kişiye mail olarak atılıyor o kişi de ağdan paylaşıyor.

    Aynı şekilde bu kişinin de hiç bir değişiklik yapma yetkisi yok sadece geleni paylaşabiliyor.

    Farklı sebepleri var böyle bir kural koymuşlar o yüzden sıkıntılı.

    Benim yaptığım işlem de şu C# ile ağdaki exceli kopyalayıp kendi bilgisayarımdaki klasöre yapıştırtmak bu şekilde daha kolay işlem yapabilirim diye düşünüyorum.

    Excelde SQL OLDB kullanmamın sebebi ise daha kolay işlem yapabilmek içindi.

    Hatalı kayıtları veya istemediğimiz kayıtları tabi ki de yazmak istemiyoruz zaten bunun için de SQL kullanmayı tercih ettim.

    Lakin benim sorunum o değil dediğim gibi excelde ilk satıra adam sayısal veri girmiş mesela ikinci satıra metinsel veri girmiş atıyorum 3. satır da tarih girmiş böyle bir kayıt yapısı düşünün şimdi ağdaki excelde işlem yapma yetkimiz olmadığı için bunu kendi bilgisayarıma kopyalattığımı söyledim ancak bu seferde bağlı sayfalar ve tablolar vs falan var silemiyorum sıkıntı çıkarıyor.

    Bu arada diğer excel sürümlerini veya başka programlar kuramıyoruz çünkü çalıştığım firma büyük bir firma ve tüm bilgisayarlar ve içindeki yazılımlar lisanslı orjinal yazılımlar başka bir yazılım kurma yetkimiz de yok.

    Neyse SQL de şöyle bir komut yazdım örğin:

    Select * From [Sayfa1$] WHERE sutunadi not like '%.%' And sutunadi is not null And sutunadi <> ''

    Bu komutu açıklamama gerek yok zaten sizde ne istediğimi koddan biliyorsunuz, lakin bana gelen veri hep null oluyor.

    Ama programı kapatıp exceli elle açtığımda o satırdaki o hücrede null veri olmadığını görüyorum.

    Buna şahsen anlam veremedim ama dediğim hatalı girişlerden dolayı bu sorun ortaya çıkıyor.

    Ama çözümü yine malesef dediğim yöntemle yapıyorum.

    Excele OLEDB olarak değil de direk Excelin .Net apisini kullanarak bağlandım ve
    bir while döngüsü kurarak satır satır sütun sütun okuyorum.

    İşte bu da çok vakit alıyor sizin daha iyi ve hızlı bir çözüm sunabileceğinizi düşündüm.

    Bu arada Theoden senin dediğin yöntemi şu an kullanıyorum artık bir while döngüsü içinde dediğim gibi satır satır hatta hücre hücre veriyi çekip tanımladığım bir List<string[]> değişkenine atıyorum, ordan da bir for döngüsü ile bu listedeki değerleri veritabanına yazdıracağım inşallah.

    Şu an Excelde 8028 adet kayıt var ve bu verileri bu şekilde henüz hepsini çekemedim, ayrıca eklemeler de devam ediyor bitmeyecek saat 12:10 de çekmeye başladı ve şu an saat 12:37 daha bu ilk döngü ve bitmiş değil.

    Fakat OLEDB yöntemiyle bağlandığımda mesela

    SELECT * From [Sayfa1$]

    yazdığımda tüm verilerin gelmesi sadece 10 sn sürdü.

    Yani aradaki fark muazzam, müthiş, mükemmel ötesi yani SQL in bu hızı beni her seferinde gerçekten etkiliyor.

    Aslında şu an bu şekilde işimi görür, zaten arkadaşlara onların anlayacağı dille programın her 20 dk bir kendini yenileyeceğini ve gelen yeni kayıtları programa aktaracağını ve onların da bu kayıtlara ulaşabileceğini söyledim.

    Umarım programın excelden verileri okuması çok uzun sürmez,
    verileri okuması 30 dk, yazması da 30 dk sürse 1 saat demektir.

    Belki insanların aradığı kayıt eğer ilk sıralardaysa 1 saat beklemezler 30 - 35 dakika beklerler tabi ama sonlardaysa 1 saat belki de daha uzun süre bekleyecekler demektir.

    Eğer onlar bu kadar beklemeyi sorun yapmazlarsa sistem bu şekilde çalışmaya devam edecek zaten ama işimiz çok yavaş ilerliyor derlerse sizden tekrar yardım isteyebilirim şu an kesin bir şey diyemiyorum.

    Çok teşekkür ediyorum tekrar.

    Logged
    programci42
    Üye
    ***
    Mesaj Sayısı: 196


    Üyelik Bilgileri
    « Yanıtla #6 : Ekim 06, 2020, 13:09:50 ÖS »

    Kusura bakmayın az önce farkettim while döngüsünün şartını yanlış yazmışım bu yüzden okuması uzun sürüyormuş 8028 kaydı 3 dk da okudu şimdi sorun yok önceden exceldeki tüm satırları okuyormuş neyse hallettim sizinde beyin enerjinizi boş yere tükettim ama helal edin .

    Ama gerçekten bak SQL den veri çektiğimde gerçekten 10 sn de geliyor veriler yine de çok hızlı tabiki bu yönteme göre neyse teşekkürler tekrar.
    Logged
    Humphrey
    Deneyimli
    *****
    Mesaj Sayısı: 923


    The right man in the wrong place


    Üyelik Bilgileri
    « Yanıtla #7 : Ekim 06, 2020, 16:35:43 ÖS »

    Excele çoklu Kullanıcı veri girişi için google’ın excel versiyonunu tavsiye ederim.

    Aynı anda bir sayfaya birden fazla kullanıcı veri girişi yapabiliyor . Ve kim ne yaptı görebiliyorsunuz.
    Ama teknoloji babında ms excelden farkları var. Halen geliştiriliyor.
    Diğer beklentinizi karşılarmı bilmem bir deneyin derim.

    https://docs.google.com/spreadsheets/u/0/
    « Son Düzenleme: Ekim 06, 2020, 16:59:29 ÖS Gönderen: Humphrey » Logged

    Amiga 500 Plus+,Aca 500+,3.1
    Amiga Cd32
    Commodore 64,64C,128
    Atari 800XL,130XE
    Nintendo wii,Nes,Snes,64,Gamecube,3DS XL,3DS,Dsi,Dslite
    Playstation 1,2,3
    Xbox 360
    Sega Saturn,Dreamcast,Mega Drive,Masterdrive
    PSP 1001,2001,3001,PSPGO
    Zx Spectrum+
    Atari Pong,Philips Videopac,Palladium,Unimax
    Sayfa: [1]   Yukarı git
    Yazdır
    Gitmek istediğiniz yer: