├── .abapgit.xml ├── LICENSE ├── README.md ├── abaplint-app.json ├── abaplint-steampunk.json ├── abaplint.json ├── demo └── ZDEMO_EMAIL.abap └── src ├── package.devc.xml ├── zcl_email.clas.abap ├── zcl_email.clas.xml ├── zcl_itab_to_html.clas.abap ├── zcl_itab_to_html.clas.xml ├── zcl_itab_to_xls.clas.abap ├── zcl_itab_to_xls.clas.xml ├── zcl_spool_to_pdf.clas.abap ├── zcl_spool_to_pdf.clas.xml ├── zcx_email.clas.abap ├── zcx_email.clas.xml └── zet_demo.smtg.xml /.abapgit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | E 6 | /src/ 7 | PREFIX 8 | 9 | /.gitignore 10 | /LICENSE 11 | /README.md 12 | /package.json 13 | /.travis.yml 14 | /_config.yml 15 | /abaplint.json 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SAP ABAP send email using eMail Templates with or without CDS 2 | ## 1. Create E-Mail Template 3 | ![image](https://user-images.githubusercontent.com/28149363/147467514-c82fdba0-99b3-40f8-b760-3dd5b9f33173.png) 4 | 5 | ![image](https://user-images.githubusercontent.com/28149363/171146686-18c41e2f-1d1a-466d-be1a-0b2e818f911f.png) 6 | 7 | ![image](https://user-images.githubusercontent.com/28149363/171146887-5a05bbf1-44ca-4f1c-8a2b-9daeb7f3043a.png) 8 | 9 | 10 | ## 2. Create class ZCL_EMAIL inheriting from CL_BCS_MESSAGE 11 | 12 | 2.1. METHODS SET_BODY_SO10 " get Email body from so10 text. 13 | 14 | 2.2. METHODS SET_PLACEHOLDER " set dynamic variable to be replaced in email to body 15 | 16 | 2.3. METHODS replace_placeholder " replace placehoder for non cds email template 17 | 18 | 2.4. METHODS SET_PLACEHOLDER_ITAB " replace Itab placehoder for non cds email template 19 | 20 | 2.5. METHODS SET_SUB_BODY_TEMPLATE "read email body from email template 21 | 22 | "2.5.1. Dont pass place holders when Email teplate created without CDS. 23 | 24 | SELECT SINGLE cds_view FROM smtg_tmpl_hdr 25 | INTO @DATA(lv_cds_view) 26 | WHERE id EQ @iv_template_id 27 | AND version EQ 'A'. "GC_VERSION_ACTIVE 28 | IF sy-subrc EQ 0. 29 | IF lv_cds_view IS NOT INITIAL. 30 | DATA(lt_data_key) = gt_data_key. 31 | ENDIF. 32 | 33 | "2.5.2. Read email template in HTML or Text. 34 | TRY. 35 | DATA(lo_email_api) = cl_smtg_email_api=>get_instance( iv_template_id = iv_template_id ). 36 | 37 | lo_email_api->render( 38 | EXPORTING 39 | iv_language = iv_lang 40 | it_data_key = lt_data_key 41 | IMPORTING 42 | ev_subject = DATA(lv_subject) 43 | ev_body_html = DATA(lv_body_html) 44 | ev_body_text = DATA(lv_body_text) ). 45 | 46 | CATCH cx_smtg_email_common INTO DATA(ex). " E-Mail API Exceptions 47 | ENDTRY. 48 | 49 | "2.5.3. Replace placehoder for non-cds email template 50 | 51 | IF iv_doctype EQ 'HTM'. 52 | DATA(lv_mailbody) = lv_body_html. 53 | ELSE. 54 | lv_mailbody = lv_body_text. 55 | ENDIF. 56 | 57 | IF lv_cds_view IS INITIAL. 58 | lv_mailbody = replace_placeholder( lv_mailbody ). 59 | lv_subject = replace_placeholder( lv_subject ). 60 | ENDIF. 61 | 62 | "2.5.4. set subject and body using supper class CL_BCS_MESSAGE 63 | 64 | set_subject( lv_subject ). 65 | 66 | set_main_doc( 67 | EXPORTING 68 | iv_contents_txt = lv_mailbody " Main Documet, First Body Part 69 | iv_doctype = iv_doctype ). " Document Category 70 | 71 | ``` 72 | 73 | ## 3. Demo program 74 | 75 | ``` 76 | REPORT zdemo_email. 77 | "send email with HTML body using email template 78 | 79 | TRY. 80 | DATA(email) = NEW zcl_email( ). 81 | data lv_expiry_dt TYPE dats. 82 | 83 | select CARRID, CONNID, FLDATE, PRICE 84 | UP TO 10 ROWS FROM SFLIGHT INTO TABLE @data(lt_SFLIGHT). 85 | 86 | lv_expiry_dt = sy-datum + 10. "add logic to get user id expiry date 87 | 88 | DATA(lv_days) = lv_expiry_dt - sy-datum. 89 | 90 | email->add_recipient( iv_address = CONV #( 'recipient@emailid.com' ) ). 91 | 92 | email->set_sender( iv_address = 'do@not.reply' iv_visible_name = 'Do not reply ' ). 93 | 94 | "set internal table as html email body 95 | email->set_placeholder_itab( 96 | EXPORTING 97 | placeholder_name = '&SFLIGHT_TAB&' 98 | placeholder_itab = lt_SFLIGHT 99 | table_Title = 'Flights Details'). 100 | 101 | email->set_placeholder( 102 | EXPORTING 103 | placeholder_name = '&USER_FIRST_NAME&' 104 | placeholder_value = CONV #( 'User firstname' ) ). 105 | 106 | email->set_placeholder( 107 | EXPORTING 108 | placeholder_name = '&USER_ID&' 109 | placeholder_value = CONV #( 'user_id' ) ). 110 | 111 | email->set_placeholder( 112 | EXPORTING 113 | placeholder_name = '&EXPIRY_DT&' 114 | placeholder_value = |{ lv_expiry_dt DATE = ISO }| ). 115 | 116 | email->set_placeholder( 117 | EXPORTING 118 | placeholder_name = '&DAYS&' 119 | placeholder_value = CONV #( lv_days ) ). 120 | 121 | email->set_subject_body_template( 122 | EXPORTING 123 | template_id = 'ZET_DEMO' "Email body from Email template 124 | doctype = 'HTM' ). 125 | 126 | email->set_send_immediately( abap_false ). 127 | email->send( ). 128 | 129 | CATCH cx_bcs_send INTO DATA(ex). 130 | MESSAGE ex->get_text( ) TYPE 'S'. 131 | ENDTRY. 132 | ``` 133 | 134 | ## 4. SOST email preview 135 | ![image](https://user-images.githubusercontent.com/28149363/171146985-1208eb8c-8204-4c30-875a-bbf3b5309ae9.png) 136 | 137 | 138 | -------------------------------------------------------------------------------- /abaplint-app.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": { 3 | "default": { 4 | "filename": "./abaplint.json" 5 | }, 6 | "steampunk": { 7 | "filename": "./abaplint-steampunk.json", 8 | "annotations": false 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /abaplint-steampunk.json: -------------------------------------------------------------------------------- 1 | { 2 | "global": { 3 | "files": "/src/**/*.*", 4 | "noIssues": ["/demos/", "/not_cloud/"] 5 | }, 6 | "dependencies": [ 7 | { 8 | "url": "https://github.com/abapedia/steampunk-2205-api", 9 | "files": "/src/**/*.*" 10 | } 11 | ], 12 | "syntax": { 13 | "version": "Cloud", 14 | "errorNamespace": "." 15 | }, 16 | "rules": { 17 | "begin_end_names": { 18 | "severity": "Warning" 19 | }, 20 | "check_ddic": { 21 | "severity": "Warning" 22 | }, 23 | "check_include": { 24 | "severity": "Warning" 25 | }, 26 | "check_syntax": { 27 | "severity": "Warning" 28 | }, 29 | "global_class": { 30 | "severity": "Warning" 31 | }, 32 | "implement_methods": { 33 | "severity": "Warning" 34 | }, 35 | "method_implemented_twice": { 36 | "severity": "Warning" 37 | }, 38 | "parser_error": { 39 | "severity": "Warning" 40 | }, 41 | "parser_missing_space": { 42 | "severity": "Warning" 43 | }, 44 | "superclass_final": { 45 | "severity": "Warning" 46 | }, 47 | "unknown_types": { 48 | "severity": "Warning" 49 | }, 50 | "xml_consistency": { 51 | "severity": "Warning" 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /abaplint.json: -------------------------------------------------------------------------------- 1 | { 2 | "global": { 3 | "files": "/src/**/*.*", 4 | "skipGeneratedGatewayClasses": true, 5 | "skipGeneratedFunctionGroups": true, 6 | "skipGeneratedPersistentClasses": true 7 | }, 8 | "dependencies": [ 9 | { 10 | "url": "https://github.com/abaplint/deps", 11 | "folder": "/deps", 12 | "files": "/src/**/*.*" 13 | } 14 | ], 15 | "syntax": { 16 | "version": "v740", 17 | "errorNamespace": "^(Z|Y)", 18 | "globalConstants": [], 19 | "globalMacros": [] 20 | }, 21 | "rules": { 22 | "align_parameters": false, 23 | "cds_legacy_view": true, 24 | "cds_parser_error": true, 25 | "classic_exceptions_overlap": true, 26 | "local_testclass_consistency": true, 27 | "no_aliases": false, 28 | "no_chained_assignment": false, 29 | "unnecessary_pragma": false, 30 | "unnecessary_chaining": false, 31 | "superfluous_value": true, 32 | "static_call_via_instance": false, 33 | "slow_parameter_passing": false, 34 | "prefer_corresponding": true, 35 | "pragma_style": true, 36 | "omit_preceding_zeros": true, 37 | "no_inline_in_optional_branches": false, 38 | "nrob_consistency": true, 39 | "no_external_form_calls": true, 40 | "constant_classes": true, 41 | "cyclic_oo": false, 42 | "many_parentheses": true, 43 | "unused_ddic": true, 44 | "dangerous_statement": true, 45 | "db_operation_in_loop": false, 46 | "identical_descriptions": false, 47 | "intf_referencing_clas": false, 48 | "max_one_method_parameter_per_line": false, 49 | "method_implemented_twice": true, 50 | "modify_only_own_db_tables": false, 51 | "no_yoda_conditions": false, 52 | "parser_702_chaining": true, 53 | "prefer_raise_exception_new": true, 54 | "select_add_order_by": false, 55 | "select_performance": false, 56 | "uncaught_exception": true, 57 | "unsecure_fae": false, 58 | "use_class_based_exceptions": false, 59 | "call_transaction_authority_check": true, 60 | "function_module_recommendations": false, 61 | "identical_contents": false, 62 | "method_overwrites_builtin": true, 63 | "omit_parameter_name": false, 64 | "omit_receiving": true, 65 | "prefer_is_not": false, 66 | "prefer_xsdbool": true, 67 | "sy_modification": true, 68 | "unused_methods": false, 69 | "use_bool_expression": false, 70 | "begin_single_include": true, 71 | "check_subrc": false, 72 | "cyclomatic_complexity": false, 73 | "forbidden_pseudo_and_pragma": false, 74 | "identical_conditions": false, 75 | "line_break_style": false, 76 | "names_no_dash": true, 77 | "parser_missing_space": true, 78 | "unused_types": false, 79 | "use_line_exists": false, 80 | "downport": false, 81 | "forbidden_void_type": false, 82 | "line_break_multiple_parameters": false, 83 | "prefer_inline": false, 84 | "reduce_string_templates": true, 85 | "forbidden_identifier": false, 86 | "try_without_catch": true, 87 | "unknown_types": true, 88 | "prefix_is_current_class": false, 89 | "unused_variables": false, 90 | "abapdoc": false, 91 | "allowed_object_naming": false, 92 | "allowed_object_types": false, 93 | "ambiguous_statement": false, 94 | "avoid_use": { 95 | "define": true, 96 | "describeLines": false, 97 | "testSeams": true, 98 | "statics": false, 99 | "defaultKey": false, 100 | "break": true 101 | }, 102 | "begin_end_names": true, 103 | "chain_mainly_declarations": false, 104 | "check_abstract": true, 105 | "check_comments": false, 106 | "check_ddic": true, 107 | "check_include": true, 108 | "check_syntax": true, 109 | "check_text_elements": false, 110 | "check_transformation_exists": true, 111 | "commented_code": false, 112 | "constructor_visibility_public": true, 113 | "description_empty": true, 114 | "double_space": false, 115 | "empty_line_in_statement": false, 116 | "empty_structure": false, 117 | "form_tables_obsolete": true, 118 | "fully_type_constants": false, 119 | "global_class": false, 120 | "identical_form_names": true, 121 | "if_in_if": false, 122 | "implement_methods": true, 123 | "in_statement_indentation": false, 124 | "indentation": false, 125 | "keep_single_parameter_on_one_line": false, 126 | "keyword_case": { 127 | "style": "upper", 128 | "ignoreExceptions": true, 129 | "ignoreLowerClassImplmentationStatement": true, 130 | "ignoreGlobalClassDefinition": false, 131 | "ignoreGlobalInterface": false, 132 | "ignoreKeywords": [], 133 | "ignoreGlobalClassBoundaries": false, 134 | "ignoreFunctionModuleName": false 135 | }, 136 | "local_class_naming": false, 137 | "main_file_contents": true, 138 | "message_exists": false, 139 | "msag_consistency": { 140 | "numericParamters": false 141 | }, 142 | "newline_between_methods": false, 143 | "no_public_attributes": false, 144 | "prefer_returning_to_exporting": false, 145 | "preferred_compare_operator": false, 146 | "release_idoc": false, 147 | "remove_descriptions": false, 148 | "rfc_error_handling": true, 149 | "selection_screen_naming": false, 150 | "short_case": false, 151 | "sicf_consistency": true, 152 | "space_before_dot": false, 153 | "sql_escape_host_variables": false, 154 | "superclass_final": false, 155 | "tabl_enhancement_category": true, 156 | "type_form_parameters": true, 157 | "types_naming": false, 158 | "unreachable_code": true, 159 | "use_new": false, 160 | "when_others_last": true, 161 | "xml_consistency": true, 162 | "7bit_ascii": false, 163 | "contains_tab": true, 164 | "functional_writing": false, 165 | "line_length": false, 166 | "max_one_statement": false, 167 | "parser_error": true, 168 | "space_before_colon": false, 169 | "colon_missing_space": false, 170 | "exit_or_check": { 171 | "allowCheck": true, 172 | "allowExit": false 173 | }, 174 | "line_only_punc": false, 175 | "obsolete_statement": { 176 | "refresh": true, 177 | "move": true 178 | }, 179 | "start_at_tab": false, 180 | "whitespace_end": true, 181 | "exporting": false, 182 | "empty_statement": false, 183 | "sequential_blank": true, 184 | "definitions_top": false, 185 | "nesting": false, 186 | "cloud_types": true, 187 | "method_length": false, 188 | "mix_returning": true, 189 | "method_parameter_names": false, 190 | "inline_data_old_versions": true, 191 | "local_variable_names": false, 192 | "class_attribute_names": false 193 | } 194 | } 195 | -------------------------------------------------------------------------------- /demo/ZDEMO_EMAIL.abap: -------------------------------------------------------------------------------- 1 | REPORT zdemo_email. 2 | "send email with HTML body using email template 3 | "Title ABAP-HTML-eMail Demo 4 | "Text elements 5 | "PEMLTMPT Email body FROM Email template 6 | "PHTMLEML HTML Email body 7 | "pitb2xls Itab TO XLS attachment 8 | "PSO10TXT Email body FROM so10 TEXT 9 | "pspl2pdf Email spool AS PDF attachment 10 | "PSPOOL Spool request NUMBER 11 | "PZIPATT ZIP attachment 12 | "P_SENDEM Send Email TO 13 | "S_DLINAM Recipient Distribution List 14 | "S_EMAIL Recipient Email id's 15 | 16 | CLASS zcl_email_demo DEFINITION 17 | FINAL 18 | CREATE PUBLIC. 19 | 20 | PUBLIC SECTION. 21 | TYPES: 22 | BEGIN OF ty_filters, 23 | phtmleml TYPE c LENGTH 1, 24 | pspl2pdf TYPE c LENGTH 1, 25 | potf2pdf TYPE c LENGTH 1, 26 | pitb2xls TYPE c LENGTH 1, 27 | pzipatt TYPE c LENGTH 1, 28 | pspool TYPE rspoid, 29 | pemltmpt TYPE smtg_tmpl_id, 30 | p_sendem TYPE c LENGTH 1, 31 | s_email TYPE RANGE OF ad_smtpadr, 32 | s_dlinam TYPE RANGE OF so_dli_nam, 33 | pso10txt TYPE tdobname, 34 | END OF ty_filters. 35 | 36 | DATA: 37 | filters TYPE ty_filters READ-ONLY. 38 | 39 | METHODS: 40 | constructor, 41 | process, 42 | htmleml, 43 | spolpdf, 44 | otfpdf, 45 | itabxls, 46 | zipattach. 47 | 48 | PRIVATE SECTION. 49 | 50 | METHODS: 51 | get_selscrn_val, 52 | sf_example_01 RETURNING VALUE(otfdata) TYPE tsfotf. 53 | 54 | ENDCLASS. 55 | 56 | CLASS zcl_email_demo IMPLEMENTATION. 57 | 58 | METHOD constructor. 59 | get_selscrn_val( ). 60 | ENDMETHOD. 61 | 62 | METHOD get_selscrn_val. 63 | 64 | DATA: 65 | li_seltab TYPE STANDARD TABLE OF rsparams WITH KEY selname, 66 | li_selopts255 TYPE STANDARD TABLE OF rsparamsl_255 WITH KEY selname. 67 | 68 | FIELD-SYMBOLS : 69 | TYPE any, 70 | TYPE STANDARD TABLE, 71 | TYPE any. 72 | 73 | CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS' 74 | EXPORTING 75 | curr_report = sy-cprog 76 | TABLES 77 | selection_table = li_seltab 78 | selection_table_255 = li_selopts255 79 | EXCEPTIONS 80 | not_found = 1 81 | no_report = 2 82 | OTHERS = 3. 83 | IF sy-subrc NE 0. 84 | ENDIF. 85 | 86 | LOOP AT li_selopts255 INTO DATA(lw_selopts255). 87 | TRY. 88 | IF lw_selopts255-kind EQ 'P'. "parameter 89 | ASSIGN COMPONENT lw_selopts255-selname OF STRUCTURE filters TO . 90 | IF sy-subrc EQ 0. 91 | = lw_selopts255-low. 92 | ENDIF. 93 | ELSEIF lw_selopts255-kind EQ 'S' AND "selection-option 94 | lw_selopts255-option IS NOT INITIAL. 95 | ASSIGN COMPONENT lw_selopts255-selname OF STRUCTURE filters TO . 96 | IF sy-subrc EQ 0. 97 | APPEND INITIAL LINE TO ASSIGNING . 98 | MOVE-CORRESPONDING lw_selopts255 TO . 99 | ENDIF. 100 | ENDIF. 101 | CATCH cx_root. 102 | CONTINUE. 103 | ENDTRY. 104 | ENDLOOP. 105 | ENDMETHOD. 106 | 107 | METHOD htmleml. 108 | CHECK filters-p_sendem = 'X'. 109 | TRY. 110 | DATA(email) = NEW zcl_email( ). 111 | 112 | LOOP AT filters-s_email INTO DATA(ls_email). 113 | email->add_recipient( CONV #( ls_email-low ) ). 114 | ENDLOOP. 115 | 116 | LOOP AT filters-s_dlinam INTO DATA(ls_dlinam). 117 | email->add_dl_recipients( ls_dlinam-low ). 118 | ENDLOOP. 119 | 120 | DATA lv_expiry_dt TYPE dats. 121 | 122 | SELECT carrid, connid, fldate, price 123 | UP TO 10 ROWS FROM sflight INTO TABLE @DATA(lt_sflight). 124 | 125 | lv_expiry_dt = sy-datum + 10. "add logic to get user id expiry date 126 | 127 | DATA(lv_days) = lv_expiry_dt - sy-datum. 128 | 129 | email->set_sender( iv_address = 'do@not.reply' iv_visible_name = 'Do not reply ' ). 130 | 131 | email->set_placeholder_itab( 132 | EXPORTING placeholder_name = '&SFLIGHT_TAB&' 133 | placeholder_itab = lt_sflight ). 134 | 135 | email->set_placeholder( 136 | EXPORTING 137 | placeholder_name = '&USER_FIRST_NAME&' 138 | placeholder_value = CONV #( 'User firstname' ) ). 139 | 140 | email->set_placeholder( 141 | EXPORTING 142 | placeholder_name = '&USER_ID&' 143 | placeholder_value = CONV #( 'user_id' ) ). 144 | 145 | email->set_placeholder( 146 | EXPORTING 147 | placeholder_name = '&EXPIRY_DT&' 148 | placeholder_value = |{ lv_expiry_dt DATE = ISO }| ). 149 | 150 | email->set_placeholder( 151 | EXPORTING 152 | placeholder_name = '&DAYS&' 153 | placeholder_value = CONV #( lv_days ) ). 154 | 155 | email->set_subject_body_template( 156 | EXPORTING 157 | template_id = filters-pemltmpt "Email body from Email template 158 | doctype = 'HTM' ). 159 | 160 | email->set_send_immediately( abap_false ). 161 | email->send( ). 162 | 163 | CATCH cx_bcs_send INTO DATA(ex). 164 | MESSAGE ex->get_text( ) TYPE 'S'. 165 | ENDTRY. 166 | 167 | ENDMETHOD. 168 | 169 | METHOD spolpdf. 170 | CHECK filters-p_sendem = 'X'. 171 | 172 | TRY. 173 | DATA(email) = NEW zcl_email( ). 174 | 175 | LOOP AT filters-s_email INTO DATA(ls_email). 176 | email->add_recipient( CONV #( ls_email-low ) ). 177 | ENDLOOP. 178 | 179 | LOOP AT filters-s_dlinam INTO DATA(ls_dlinam). 180 | email->add_dl_recipients( ls_dlinam-low ). 181 | ENDLOOP. 182 | 183 | email->set_sender( iv_address = 'do@not.reply' iv_visible_name = 'Do not reply' ). 184 | 185 | email->set_placeholder( 186 | EXPORTING 187 | placeholder_name = '&USER_FIRST_NAME&' 188 | placeholder_value = CONV #( 'User firstname' ) ). 189 | 190 | email->add_attachment( 191 | EXPORTING 192 | iv_doctype = 'pdf' " Document Type 193 | "iv_description = " Short Description of Contents 194 | iv_filename = |{ filters-pspool }.pdf| " File Name (with Extension) 195 | iv_contents_bin = 196 | NEW zcl_spool_to_pdf( )->convert( filters-pspool ) ). " Binary Document Content 197 | 198 | email->set_body_so10( text_name = filters-pso10txt ). 199 | email->set_subject_so10( text_name = '' ). 200 | email->set_subject( 'Email Demo2 PDF attachment' ). 201 | 202 | email->set_send_immediately( abap_false ). 203 | email->send( ). 204 | 205 | CATCH zcx_email INTO DATA(lx_email). 206 | MESSAGE lx_email->get_text( ) TYPE 'S'. 207 | CATCH cx_bcs_send INTO DATA(ex) . 208 | MESSAGE ex->get_text( ) TYPE 'S'. 209 | ENDTRY. 210 | ENDMETHOD. 211 | 212 | METHOD otfpdf. 213 | CHECK filters-p_sendem = 'X'. 214 | 215 | TRY. 216 | DATA(email) = NEW zcl_email( ). 217 | 218 | LOOP AT filters-s_email INTO DATA(ls_email). 219 | email->add_recipient( CONV #( ls_email-low ) ). 220 | ENDLOOP. 221 | 222 | LOOP AT filters-s_dlinam INTO DATA(ls_dlinam). 223 | email->add_dl_recipients( ls_dlinam-low ). 224 | ENDLOOP. 225 | 226 | email->set_sender( iv_address = 'do@not.reply' iv_visible_name = 'Do not reply' ). 227 | 228 | email->set_placeholder( 229 | EXPORTING 230 | placeholder_name = '&USER_FIRST_NAME&' 231 | placeholder_value = CONV #( 'User firstname' ) ). 232 | 233 | TRY. 234 | "DATA(otfdata) = sf_example_01( ). 235 | DATA(lv_contents_bin) = NEW zcl_otf_to_pdf( )->convert( sf_example_01( ) ). 236 | 237 | email->add_attachment( 238 | EXPORTING 239 | iv_doctype = 'pdf' " Document Type 240 | "iv_description = " Short Description of Contents 241 | iv_filename = |OTF_TO_PDF.pdf| " File Name (with Extension) 242 | iv_contents_bin = lv_contents_bin ). " Binary Document Content 243 | CATCH zcx_email INTO DATA(lx_email). 244 | MESSAGE lx_email->get_text( ) TYPE 'S'. 245 | ENDTRY. 246 | 247 | 248 | email->set_body_so10( text_name = filters-pso10txt ). 249 | email->set_subject_so10( text_name = '' ). 250 | email->set_subject( 'Email OTF_TO_PDF attachment' ). 251 | 252 | email->set_send_immediately( abap_false ). 253 | email->send( ). 254 | 255 | CATCH zcx_email INTO lx_email. 256 | MESSAGE lx_email->get_text( ) TYPE 'S'. 257 | CATCH cx_bcs_send INTO DATA(ex) . 258 | MESSAGE ex->get_text( ) TYPE 'S'. 259 | ENDTRY. 260 | 261 | ENDMETHOD. 262 | 263 | METHOD itabxls. 264 | CHECK filters-p_sendem = 'X'. 265 | 266 | TRY. 267 | DATA(email) = NEW zcl_email( ). 268 | 269 | LOOP AT filters-s_email INTO DATA(ls_email). 270 | email->add_recipient( CONV #( ls_email-low ) ). 271 | ENDLOOP. 272 | 273 | LOOP AT filters-s_dlinam INTO DATA(ls_dlinam). 274 | email->add_dl_recipients( ls_dlinam-low ). 275 | ENDLOOP. 276 | 277 | email->set_sender( iv_address = 'do@not.reply' iv_visible_name = 'Do not reply ' ). 278 | 279 | email->set_placeholder( 280 | EXPORTING 281 | placeholder_name = '&USER_FIRST_NAME&' 282 | placeholder_value = CONV #( 'User firstname' ) ). 283 | 284 | SELECT carrid, connid, fldate, price 285 | UP TO 10 ROWS FROM sflight INTO TABLE @DATA(lt_sflight). 286 | 287 | IF lt_sflight IS NOT INITIAL. 288 | 289 | email->add_attachment( 290 | EXPORTING 291 | iv_doctype = |XLS| " Document Type 292 | iv_filename = |itab_to_excel.xls| " File Name (with Extension) 293 | iv_contents_bin = NEW zcl_itab_to_xls( )->convert( lt_sflight ) ). " Binary Document Content 294 | ENDIF. 295 | 296 | email->set_subject_body_template( 297 | EXPORTING 298 | template_id = filters-pemltmpt "Email body from Email template 299 | doctype = 'HTM' ). 300 | 301 | email->set_send_immediately( abap_false ). 302 | email->send( ). 303 | 304 | CATCH zcx_email INTO DATA(lx_email). 305 | MESSAGE lx_email->get_text( ) TYPE 'S'. 306 | CATCH cx_bcs_send INTO DATA(ex) . 307 | MESSAGE ex->get_text( ) TYPE 'S'. 308 | ENDTRY. 309 | ENDMETHOD. 310 | 311 | METHOD zipattach. 312 | CHECK filters-p_sendem = 'X'. 313 | 314 | TRY. 315 | DATA(email) = NEW zcl_email( ). 316 | 317 | LOOP AT filters-s_email INTO DATA(ls_email). 318 | email->add_recipient( CONV #( ls_email-low ) ). 319 | ENDLOOP. 320 | 321 | LOOP AT filters-s_dlinam INTO DATA(ls_dlinam). 322 | email->add_dl_recipients( ls_dlinam-low ). 323 | ENDLOOP. 324 | 325 | email->set_sender( iv_address = 'do@not.reply' iv_visible_name = 'Do not reply ' ). 326 | 327 | email->set_placeholder( 328 | EXPORTING 329 | placeholder_name = '&USER_FIRST_NAME&' 330 | placeholder_value = CONV #( 'User firstname' ) ). 331 | 332 | SELECT carrid, connid, fldate, price 333 | UP TO 10 ROWS FROM sflight INTO TABLE @DATA(lt_sflight). 334 | 335 | IF lt_sflight IS NOT INITIAL. 336 | email->add_zip_attachments( EXPORTING 337 | i_zip_filename = 'attach.zip' 338 | it_attachments = VALUE bcst_attachment( 339 | ( doctype = 'HTM' 340 | filename = |itab_to_HTML.html| 341 | contents_txt = NEW zcl_itab_to_html( )->convert( lt_sflight ) ) 342 | ( doctype = 'XLS' 343 | filename = |itab_to_excel.xls| 344 | contents_bin = NEW zcl_itab_to_xls( )->convert( lt_sflight ) ) 345 | ) 346 | ). 347 | ENDIF. 348 | 349 | email->set_subject_body_template( 350 | EXPORTING 351 | template_id = filters-pemltmpt "Email body from Email template 352 | doctype = 'HTM' ). 353 | 354 | email->set_send_immediately( abap_false ). 355 | email->send( ). 356 | 357 | CATCH zcx_email INTO DATA(lx_email). 358 | MESSAGE lx_email->get_text( ) TYPE 'S'. 359 | CATCH cx_bcs_send INTO DATA(ex) . 360 | MESSAGE ex->get_text( ) TYPE 'S'. 361 | ENDTRY. 362 | ENDMETHOD. 363 | 364 | METHOD sf_example_01. 365 | DATA: 366 | fm_name TYPE rs38l_fnam, 367 | ls_output_options TYPE ssfcompop, 368 | ls_control_parameters TYPE ssfctrlop, 369 | ls_job_output_info TYPE ssfcrescl, 370 | customer TYPE scustom, 371 | bookings TYPE ty_bookings, 372 | connections TYPE ty_connections. 373 | 374 | * get data 375 | SELECT SINGLE * FROM scustom INTO customer WHERE id = '1'. 376 | CHECK sy-subrc = 0. 377 | 378 | SELECT * 379 | FROM sbook INTO TABLE bookings 380 | WHERE customid = customer-id 381 | AND carrid = 'LH' 382 | ORDER BY PRIMARY KEY. 383 | 384 | IF bookings[] IS NOT INITIAL. 385 | SELECT * FROM spfli INTO TABLE connections 386 | FOR ALL ENTRIES IN bookings 387 | WHERE carrid = bookings-carrid 388 | AND connid = bookings-connid 389 | ORDER BY PRIMARY KEY. 390 | ENDIF. 391 | 392 | * print data 393 | CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' 394 | EXPORTING 395 | formname = 'SF_EXAMPLE_01' 396 | IMPORTING 397 | fm_name = fm_name 398 | EXCEPTIONS 399 | no_form = 1 400 | no_function_module = 2 401 | OTHERS = 3. 402 | 403 | IF sy-subrc <> 0. 404 | * error handling 405 | MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno 406 | WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. 407 | EXIT. 408 | ENDIF. 409 | 410 | ls_control_parameters-getotf = 'X'. 411 | ls_control_parameters-no_dialog = 'X'. 412 | ls_output_options-tddest = |LP01|. 413 | 414 | * now call the generated function module 415 | CALL FUNCTION fm_name 416 | EXPORTING 417 | control_parameters = ls_control_parameters 418 | output_options = ls_output_options 419 | customer = customer 420 | bookings = bookings 421 | connections = connections 422 | IMPORTING 423 | * document_output_info = 424 | job_output_info = ls_job_output_info 425 | * job_output_options = 426 | EXCEPTIONS 427 | formatting_error = 1 428 | internal_error = 2 429 | send_error = 3 430 | user_canceled = 4 431 | OTHERS = 5. 432 | 433 | IF sy-subrc <> 0. 434 | * error handling 435 | MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno 436 | WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. 437 | ELSE. 438 | otfdata = ls_job_output_info-otfdata. 439 | ENDIF. 440 | ENDMETHOD. 441 | 442 | METHOD process. 443 | 444 | IF 'X' = filters-phtmleml. 445 | htmleml( ). 446 | ENDIF. 447 | IF 'X' = filters-pspl2pdf. 448 | spolpdf( ). 449 | ENDIF. 450 | IF 'X' = filters-potf2pdf. 451 | otfpdf( ). 452 | ENDIF. 453 | IF 'X' = filters-pitb2xls. 454 | itabxls( ). 455 | ENDIF. 456 | IF 'X' = filters-pzipatt. 457 | zipattach( ). 458 | ENDIF. 459 | 460 | ENDMETHOD. 461 | 462 | ENDCLASS. 463 | 464 | PARAMETERS: 465 | "HTML Email body 466 | phtmleml AS CHECKBOX DEFAULT 'X' USER-COMMAND abcd, 467 | "Email spool as PDF attachment 468 | pspl2pdf AS CHECKBOX DEFAULT 'X' USER-COMMAND abcd, 469 | "Email OTF as PDF attachment 470 | potf2pdf AS CHECKBOX DEFAULT 'X' USER-COMMAND abcd, 471 | "Itab to XLS attachment 472 | pitb2xls AS CHECKBOX DEFAULT 'X' USER-COMMAND abcd, 473 | "ZIP attachment 474 | pzipatt AS CHECKBOX DEFAULT 'X' USER-COMMAND abcd, 475 | "Spool request number 476 | pspool TYPE rspoid MODIF ID spl, " DEFAULT '30594', 477 | "Email body from Email template 478 | pemltmpt TYPE smtg_tmpl_id MODIF ID tmp DEFAULT 'ZET_DEMO', 479 | "Email body from so10 text 480 | pso10txt TYPE tdobname MODIF ID spl DEFAULT 'ZEMAIL_DEMO2_BODY'. 481 | 482 | DATA : 483 | soemail TYPE ad_smtpadr, 484 | gv_so_dli_nam TYPE so_dli_nam, 485 | gs_restrict TYPE sscr_restrict. 486 | 487 | SELECTION-SCREEN BEGIN OF BLOCK rdblk WITH FRAME TITLE blkttl. 488 | PARAMETERS p_sendem AS CHECKBOX MODIF ID gr1 DEFAULT 'X'. "Send Mail 489 | SELECT-OPTIONS s_email FOR soemail NO INTERVALS MODIF ID gr1. "E-Mail Address 490 | SELECT-OPTIONS s_dlinam FOR gv_so_dli_nam NO INTERVALS MATCHCODE OBJECT /aif/so_dli_nam. 491 | SELECTION-SCREEN END OF BLOCK rdblk. 492 | 493 | AT SELECTION-SCREEN OUTPUT. 494 | IF pspl2pdf = 'X' OR 495 | pzipatt = 'X'. 496 | DATA(lv_active) = 1. 497 | ELSE. 498 | lv_active = 0. 499 | ENDIF. 500 | 501 | IF phtmleml = 'X' OR pitb2xls = 'X'. 502 | DATA(lv_active1) = 1. 503 | ELSE. 504 | lv_active1 = 0. 505 | ENDIF. 506 | 507 | LOOP AT SCREEN. 508 | CASE screen-group1. 509 | WHEN 'SPL'. 510 | screen-active = lv_active. 511 | MODIFY SCREEN. 512 | WHEN 'TMP'. 513 | screen-active = lv_active1. 514 | MODIFY SCREEN. 515 | ENDCASE. 516 | ENDLOOP. 517 | 518 | INITIALIZATION. 519 | 520 | SELECT rqident UP TO 1 ROWS 521 | FROM tsp01 INTO pspool 522 | ORDER BY rqcretime DESCENDING. 523 | ENDSELECT. 524 | 525 | s_email[] = VALUE #( sign = 'I' option = 'EQ' 526 | ( low = 'test@test.com' ) ). 527 | 528 | START-OF-SELECTION. 529 | IF pspool IS INITIAL. 530 | SELECT rqident UP TO 1 ROWS 531 | FROM tsp01 INTO pspool 532 | ORDER BY rqcretime DESCENDING. 533 | ENDSELECT. 534 | ENDIF. 535 | 536 | pemltmpt = COND #( WHEN pemltmpt IS INITIAL THEN |ZET_DEMO| ELSE pemltmpt ). 537 | pso10txt = COND #( WHEN pso10txt IS INITIAL THEN |ZEMAIL_DEMO2_BODY| ELSE pso10txt ). 538 | 539 | DATA(email_demo) = NEW zcl_email_demo( ). 540 | email_demo->process( ). 541 | -------------------------------------------------------------------------------- /src/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Email 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/zcl_email.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Email

2 | CLASS zcl_email DEFINITION 3 | PUBLIC 4 | INHERITING FROM cl_bcs_message 5 | FINAL 6 | CREATE PUBLIC. 7 | 8 | PUBLIC SECTION. 9 | 10 | METHODS: 11 | "!

set email body from so10 text

12 | set_body_so10 13 | IMPORTING 14 | text_name TYPE tdobname 15 | language TYPE bcs_language DEFAULT sy-langu 16 | doctype TYPE bcs_doctype DEFAULT 'txt' 17 | tdid TYPE thead-tdid DEFAULT 'ST' 18 | tdobject TYPE thead-tdobject DEFAULT 'TEXT', 19 | 20 | "!

set email subject from so10 text

21 | set_subject_so10 22 | IMPORTING 23 | text_name TYPE tdobname 24 | language TYPE bcs_language DEFAULT sy-langu 25 | doctype TYPE bcs_doctype DEFAULT 'txt' 26 | tdid TYPE thead-tdid DEFAULT 'ST' 27 | tdobject TYPE thead-tdobject DEFAULT 'TEXT', 28 | 29 | "!

set email body and subject from email Template id

30 | set_subject_body_template 31 | IMPORTING 32 | template_id TYPE smtg_tmpl_id 33 | language TYPE bcs_language DEFAULT sy-langu 34 | doctype TYPE bcs_doctype DEFAULT 'txt', 35 | 36 | "!

set placeholder

37 | set_placeholder 38 | IMPORTING 39 | placeholder_name TYPE string 40 | placeholder_value TYPE string, 41 | 42 | "!

Add recipient email id from SAP DL

43 | add_dl_recipients 44 | IMPORTING 45 | dlinam TYPE so_dli_nam 46 | copy TYPE bcs_copy OPTIONAL, 47 | 48 | "!

set Itab Placeholder

49 | set_placeholder_itab 50 | IMPORTING 51 | placeholder_name TYPE string 52 | VALUE(placeholder_itab) TYPE STANDARD TABLE, 53 | 54 | "!

add ZIP attachments

55 | add_zip_attachments 56 | IMPORTING 57 | i_zip_doctype TYPE bcs_doctype DEFAULT 'zip' 58 | i_zip_description TYPE bcs_description OPTIONAL 59 | i_zip_filename TYPE bcs_filename DEFAULT 'attach.zip' 60 | i_codepage TYPE bcs_codepage OPTIONAL 61 | it_attachments TYPE bcst_attachment 62 | RAISING 63 | zcx_email. 64 | 65 | CLASS-METHODS: 66 | "!

validate email id

67 | is_emailid_valid 68 | IMPORTING 69 | emailid TYPE ad_smtpadr 70 | RETURNING 71 | VALUE(is_emailid_valid) TYPE abap_bool . 72 | 73 | PROTECTED SECTION. 74 | PRIVATE SECTION. 75 | 76 | DATA gt_data_key TYPE if_smtg_email_template=>ty_gt_data_key . 77 | 78 | METHODS: 79 | "!

Replace placeholder than CDS

80 | replace_placeholder 81 | IMPORTING replace_string TYPE string 82 | RETURNING VALUE(result) TYPE string, 83 | 84 | "!

read so10 text

85 | read_so10_text 86 | IMPORTING text_name TYPE tdobname 87 | language TYPE bcs_language DEFAULT sy-langu 88 | doctype TYPE bcs_doctype DEFAULT 'txt' 89 | tdid TYPE thead-tdid DEFAULT 'ST' 90 | tdobject TYPE thead-tdobject DEFAULT 'TEXT' 91 | RETURNING VALUE(r_contents_txt) TYPE string, 92 | 93 | "!

DL public or private

94 | is_dl_shared 95 | IMPORTING dl_name TYPE so_dli_nam 96 | RETURNING VALUE(r_shared_dl) TYPE so_text001. 97 | 98 | ENDCLASS. 99 | 100 | CLASS zcl_email IMPLEMENTATION. 101 | 102 | METHOD add_dl_recipients. 103 | 104 | DATA : 105 | li_dli TYPE TABLE OF sodlienti1. 106 | 107 | DATA(lv_shared_dli) = is_dl_shared( dlinam ). 108 | 109 | CALL FUNCTION 'SO_DLI_READ_API1' 110 | EXPORTING 111 | dli_name = dlinam 112 | shared_dli = lv_shared_dli 113 | TABLES 114 | dli_entries = li_dli 115 | EXCEPTIONS 116 | dli_not_exist = 1 117 | operation_no_authorization = 2 118 | parameter_error = 3 119 | x_error = 4 120 | OTHERS = 5. 121 | IF sy-subrc = 0. 122 | LOOP AT li_dli INTO DATA(ls_dli). 123 | add_recipient( 124 | iv_address = CONV #( ls_dli-member_adr ) " Communication Address (for INT, FAX, SMS, and so on) 125 | iv_visible_name = CONV #( ls_dli-full_name ) " Display Name of an Address 126 | iv_copy = copy ). " Copy Recipients (None, CC, BCC) 127 | 128 | ENDLOOP. 129 | ENDIF. 130 | 131 | ENDMETHOD. 132 | 133 | METHOD add_zip_attachments. 134 | 135 | DATA: 136 | lv_xstring TYPE xstring. 137 | 138 | IF it_attachments IS NOT INITIAL. 139 | TRY. 140 | DATA(lo_zippers) = NEW cl_abap_zip( ). "" Zip class Declaration 141 | 142 | LOOP AT it_attachments INTO DATA(ls_attachments). 143 | CLEAR lv_xstring. 144 | 145 | IF ls_attachments-contents_txt IS INITIAL AND 146 | ls_attachments-contents_bin IS INITIAL. 147 | ELSE. 148 | IF ls_attachments-contents_txt IS NOT INITIAL. 149 | 150 | lv_xstring = 151 | cl_bcs_convert=>string_to_xstring( iv_string = ls_attachments-contents_txt 152 | iv_codepage = CONV #( ls_attachments-codepage ) ). "'4103' 153 | 154 | ELSEIF ls_attachments-contents_bin IS NOT INITIAL.. 155 | lv_xstring = ls_attachments-contents_bin. 156 | ENDIF. 157 | 158 | "Xstring to binary 159 | "add file to zip 160 | lo_zippers->add( name = ls_attachments-filename 161 | content = lv_xstring ). 162 | 163 | ENDIF. 164 | ENDLOOP. 165 | 166 | CLEAR lv_xstring. 167 | "save zip 168 | lv_xstring = lo_zippers->save( ). 169 | 170 | CATCH cx_bcs. 171 | "MESSAGE e445(so). 172 | zcx_email=>raise_t100( iv_msgid = 'SO' 173 | iv_msgno = 445 ). 174 | ENDTRY. 175 | 176 | add_attachment( iv_doctype = i_zip_doctype " Document Type 177 | iv_description = i_zip_description " Short Description of Contents 178 | iv_filename = i_zip_filename " File Name (with Extension) 179 | iv_contents_bin = lv_xstring ). " Binary Document Content 180 | 181 | ENDIF. 182 | ENDMETHOD. 183 | 184 | METHOD is_dl_shared. 185 | 186 | SELECT SINGLE owntp, ownyr, ownno 187 | FROM soid INTO @DATA(ls_soid) 188 | WHERE objnam = @dl_name AND 189 | dlitp EQ 'DLI'. 190 | 191 | IF ls_soid IS INITIAL. 192 | "shared DL 193 | r_shared_dl = 'X'. 194 | ELSE. 195 | "Private DL 196 | r_shared_dl = space. 197 | ENDIF. 198 | ENDMETHOD. 199 | 200 | METHOD is_emailid_valid. 201 | DATA ls_address TYPE sx_address. 202 | ls_address-type = 'INT'. 203 | ls_address-address = emailid. 204 | 205 | CALL FUNCTION 'SX_INTERNET_ADDRESS_TO_NORMAL' 206 | EXPORTING 207 | address_unstruct = ls_address 208 | EXCEPTIONS 209 | error_address_type = 1 210 | error_address = 2 211 | error_group_address = 3 212 | OTHERS = 4. 213 | IF sy-subrc EQ 0. 214 | is_emailid_valid = abap_true. 215 | ENDIF. 216 | ENDMETHOD. 217 | 218 | METHOD read_so10_text. 219 | DATA : 220 | li_lines TYPE TABLE OF tline, 221 | lw_lines TYPE tline. 222 | 223 | DATA: lv_no_of_lines LIKE sy-tabix, 224 | lv_changed(1) TYPE c. 225 | 226 | DATA: lv_header TYPE thead. 227 | 228 | IF text_name IS NOT INITIAL. 229 | 230 | CALL FUNCTION 'READ_TEXT' 231 | EXPORTING 232 | id = tdid "'ST' 233 | language = language 234 | name = text_name 235 | object = tdobject "'TEXT' 236 | IMPORTING 237 | header = lv_header 238 | TABLES 239 | lines = li_lines 240 | EXCEPTIONS 241 | id = 1 242 | language = 2 243 | name = 3 244 | not_found = 4 245 | object = 5 246 | reference_check = 6 247 | wrong_access_to_archive = 7 248 | OTHERS = 8. 249 | 250 | IF sy-subrc <> 0. 251 | * MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno 252 | * WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. 253 | ELSE. 254 | 255 | LOOP AT gt_data_key INTO DATA(ls_data_key). 256 | CALL FUNCTION 'TEXT_SYMBOL_SETVALUE' 257 | EXPORTING 258 | name = ls_data_key-name 259 | value = ls_data_key-value. 260 | ENDLOOP. 261 | 262 | DESCRIBE TABLE li_lines LINES lv_no_of_lines. 263 | 264 | CALL FUNCTION 'TEXT_SYMBOL_REPLACE' 265 | EXPORTING 266 | endline = lv_no_of_lines 267 | header = lv_header 268 | init = ' ' 269 | option_dialog = ' ' 270 | program = sy-cprog 271 | IMPORTING 272 | changed = lv_changed 273 | newheader = lv_header 274 | TABLES 275 | lines = li_lines. 276 | 277 | LOOP AT li_lines INTO lw_lines. 278 | IF lw_lines-tdformat = '=' OR 279 | lw_lines-tdformat = ' '. " Continuous Text 280 | r_contents_txt = r_contents_txt && lw_lines-tdline. 281 | ELSE. 282 | r_contents_txt = r_contents_txt && cl_abap_char_utilities=>cr_lf && lw_lines-tdline. 283 | ENDIF. 284 | ENDLOOP. 285 | ENDIF. 286 | ENDIF. 287 | ENDMETHOD. 288 | 289 | METHOD replace_placeholder. 290 | result = replace_string. 291 | LOOP AT gt_data_key INTO DATA(ls_data_key). 292 | REPLACE ALL OCCURRENCES OF ls_data_key-name IN result WITH ls_data_key-value. 293 | ENDLOOP. 294 | ENDMETHOD. 295 | 296 | METHOD set_body_so10. 297 | "get Email body from so10 text. 298 | set_main_doc( 299 | EXPORTING 300 | iv_contents_txt = " Main Documet, First Body Part 301 | read_so10_text( EXPORTING text_name = text_name 302 | language = language 303 | doctype = doctype 304 | tdid = tdid 305 | tdobject = tdobject ) 306 | iv_doctype = doctype ). " Document Category 307 | 308 | ENDMETHOD. 309 | 310 | 311 | METHOD set_placeholder. 312 | APPEND VALUE #( name = placeholder_name 313 | value = placeholder_value ) 314 | TO gt_data_key. 315 | ENDMETHOD. 316 | 317 | METHOD set_placeholder_itab. 318 | 319 | APPEND VALUE #( name = placeholder_name 320 | "Convert ITAB to HTML. zcl_itab_to_html 321 | value = NEW zcl_itab_to_html( )->convert( placeholder_itab ) ) 322 | TO gt_data_key. 323 | ENDMETHOD. 324 | 325 | METHOD set_subject_body_template. 326 | 327 | " read headers 328 | SELECT SINGLE cds_view FROM smtg_tmpl_hdr 329 | INTO @DATA(lv_cds_view) 330 | WHERE id EQ @template_id 331 | AND version EQ 'A'. "GC_VERSION_ACTIVE 332 | IF sy-subrc EQ 0. 333 | IF lv_cds_view IS NOT INITIAL. 334 | DATA(lt_data_key) = gt_data_key. 335 | ENDIF. 336 | 337 | TRY. 338 | DATA(lo_email_api) = cl_smtg_email_api=>get_instance( iv_template_id = template_id ). 339 | 340 | lo_email_api->render( 341 | EXPORTING 342 | iv_language = language 343 | it_data_key = lt_data_key 344 | IMPORTING 345 | ev_subject = DATA(lv_subject) 346 | ev_body_html = DATA(lv_body_html) 347 | ev_body_text = DATA(lv_body_text) ). 348 | 349 | CATCH cx_smtg_email_common INTO DATA(ex). " E-Mail API Exceptions 350 | ENDTRY. 351 | 352 | IF doctype EQ 'HTM'. 353 | DATA(lv_mailbody) = lv_body_html. 354 | ELSE. 355 | lv_mailbody = lv_body_text. 356 | ENDIF. 357 | 358 | IF lv_cds_view IS INITIAL. 359 | lv_mailbody = replace_placeholder( lv_mailbody ). 360 | lv_subject = replace_placeholder( lv_subject ). 361 | ENDIF. 362 | 363 | set_subject( lv_subject ). 364 | 365 | set_main_doc( iv_contents_txt = lv_mailbody " Main Documet, First Body Part 366 | iv_doctype = doctype ). " Document Category 367 | 368 | ENDIF. 369 | ENDMETHOD. 370 | 371 | METHOD set_subject_so10. 372 | "get Email subject from so10 text. 373 | set_subject( iv_subject = read_so10_text( text_name = text_name 374 | language = language 375 | doctype = doctype 376 | tdid = tdid 377 | tdobject = tdobject ) ). 378 | ENDMETHOD. 379 | ENDCLASS. 380 | -------------------------------------------------------------------------------- /src/zcl_email.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_EMAIL 7 | E 8 | Email 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | ADD_DL_RECIPIENTS 17 | 7 18 | Add recipient email id from SAP DL 19 | 20 | 21 | ADD_DL_RECIPIENTS 22 | E 23 | Add recipient email id from SAP DL 24 | 25 | 26 | ADD_DL_RECIPIENTS 27 | W 28 | Add recipient email id from SAP DL 29 | 30 | 31 | ADD_DL_RECIPIENTS 32 | Z 33 | Add recipient email id from SAP DL 34 | 35 | 36 | ADD_DL_RECIPIENTS 37 | a 38 | Add recipient email id from SAP DL 39 | 40 | 41 | ADD_DL_RECIPIENTS 42 | 43 | Add recipient email id from SAP DL 44 | 45 | 46 | ADD_DL_RECIPIENTS 47 | 48 | Add recipient email id from SAP DL 49 | 50 | 51 | ADD_ZIP_ATTACHMENTS 52 | E 53 | add ZIP attachments 54 | 55 | 56 | IS_DL_SHARED 57 | E 58 | DL public or private 59 | 60 | 61 | IS_EMAILID_VALID 62 | 7 63 | validate email id 64 | 65 | 66 | IS_EMAILID_VALID 67 | E 68 | validate email id 69 | 70 | 71 | IS_EMAILID_VALID 72 | W 73 | validate email id 74 | 75 | 76 | IS_EMAILID_VALID 77 | Z 78 | validate email id 79 | 80 | 81 | IS_EMAILID_VALID 82 | a 83 | validate email id 84 | 85 | 86 | IS_EMAILID_VALID 87 | 88 | validate email id 89 | 90 | 91 | IS_EMAILID_VALID 92 | 93 | validate email id 94 | 95 | 96 | READ_SO10_TEXT 97 | E 98 | read so10 text 99 | 100 | 101 | REPLACE_PLACEHOLDER 102 | 7 103 | Replace placeholder than CDS 104 | 105 | 106 | REPLACE_PLACEHOLDER 107 | E 108 | Replace placeholder than CDS 109 | 110 | 111 | REPLACE_PLACEHOLDER 112 | W 113 | Replace placeholder than CDS 114 | 115 | 116 | REPLACE_PLACEHOLDER 117 | Z 118 | Replace placeholder than CDS 119 | 120 | 121 | REPLACE_PLACEHOLDER 122 | a 123 | Replace placeholder than CDS 124 | 125 | 126 | REPLACE_PLACEHOLDER 127 | 128 | Replace placeholder than CDS 129 | 130 | 131 | REPLACE_PLACEHOLDER 132 | 133 | Replace placeholder than CDS 134 | 135 | 136 | SET_BODY_SO10 137 | 7 138 | set email body from so10 text 139 | 140 | 141 | SET_BODY_SO10 142 | E 143 | set email body from so10 text 144 | 145 | 146 | SET_BODY_SO10 147 | W 148 | set email body from so10 text 149 | 150 | 151 | SET_BODY_SO10 152 | Z 153 | set email body from so10 text 154 | 155 | 156 | SET_BODY_SO10 157 | a 158 | set email body from so10 text 159 | 160 | 161 | SET_BODY_SO10 162 | 163 | set email body from so10 text 164 | 165 | 166 | SET_BODY_SO10 167 | 168 | set email body from so10 text 169 | 170 | 171 | SET_PLACEHOLDER 172 | 7 173 | set placeholder 174 | 175 | 176 | SET_PLACEHOLDER 177 | E 178 | set placeholder 179 | 180 | 181 | SET_PLACEHOLDER 182 | W 183 | set placeholder 184 | 185 | 186 | SET_PLACEHOLDER 187 | Z 188 | set placeholder 189 | 190 | 191 | SET_PLACEHOLDER 192 | a 193 | set placeholder 194 | 195 | 196 | SET_PLACEHOLDER 197 | 198 | set placeholder 199 | 200 | 201 | SET_PLACEHOLDER 202 | 203 | set placeholder 204 | 205 | 206 | SET_PLACEHOLDER_ITAB 207 | 7 208 | set placeholder internal table 209 | 210 | 211 | SET_PLACEHOLDER_ITAB 212 | E 213 | set Itab Placeholder 214 | 215 | 216 | SET_PLACEHOLDER_ITAB 217 | W 218 | set placeholder internal table 219 | 220 | 221 | SET_PLACEHOLDER_ITAB 222 | Z 223 | set placeholder internal table 224 | 225 | 226 | SET_PLACEHOLDER_ITAB 227 | a 228 | set placeholder internal table 229 | 230 | 231 | SET_PLACEHOLDER_ITAB 232 | 233 | set placeholder internal table 234 | 235 | 236 | SET_PLACEHOLDER_ITAB 237 | 238 | set placeholder internal table 239 | 240 | 241 | SET_SUBJECT_BODY_TEMPLATE 242 | 7 243 | set email body and subject from email Template id 244 | 245 | 246 | SET_SUBJECT_BODY_TEMPLATE 247 | E 248 | set email body and subject from email Template id 249 | 250 | 251 | SET_SUBJECT_BODY_TEMPLATE 252 | W 253 | set email body and subject from email Template id 254 | 255 | 256 | SET_SUBJECT_BODY_TEMPLATE 257 | Z 258 | set email body and subject from email Template id 259 | 260 | 261 | SET_SUBJECT_BODY_TEMPLATE 262 | a 263 | set email body and subject from email Template id 264 | 265 | 266 | SET_SUBJECT_BODY_TEMPLATE 267 | 268 | set email body and subject from email Template id 269 | 270 | 271 | SET_SUBJECT_BODY_TEMPLATE 272 | 273 | set email body and subject from email Template id 274 | 275 | 276 | SET_SUBJECT_SO10 277 | E 278 | set email subject from so10 text 279 | 280 | 281 | 282 | 283 | SET_SUBJECT_BODY_TEMPLATE 284 | DOCTYPE 285 | 7 286 | HTM HTML or txt Text 287 | 288 | 289 | SET_SUBJECT_BODY_TEMPLATE 290 | DOCTYPE 291 | E 292 | HTM HTML or txt Text 293 | 294 | 295 | SET_SUBJECT_BODY_TEMPLATE 296 | DOCTYPE 297 | W 298 | HTM HTML or txt Text 299 | 300 | 301 | SET_SUBJECT_BODY_TEMPLATE 302 | DOCTYPE 303 | Z 304 | HTM HTML or txt Text 305 | 306 | 307 | SET_SUBJECT_BODY_TEMPLATE 308 | DOCTYPE 309 | a 310 | HTM HTML or txt Text 311 | 312 | 313 | SET_SUBJECT_BODY_TEMPLATE 314 | DOCTYPE 315 | 316 | HTM HTML or txt Text 317 | 318 | 319 | SET_SUBJECT_BODY_TEMPLATE 320 | DOCTYPE 321 | 322 | HTM HTML or txt Text 323 | 324 | 325 | 326 | 327 | 328 | -------------------------------------------------------------------------------- /src/zcl_itab_to_html.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Converts the internal table into HTML format

2 | CLASS zcl_itab_to_html DEFINITION PUBLIC CREATE PUBLIC. 3 | PUBLIC SECTION. 4 | METHODS: 5 | 6 | constructor 7 | IMPORTING 8 | table_id TYPE string OPTIONAL 9 | table_class TYPE string OPTIONAL 10 | table_style TYPE string DEFAULT 'width: 80%; border: #999 1px solid; border-collapse: collapse;' 11 | tr_class TYPE string OPTIONAL 12 | tr_style TYPE string OPTIONAL 13 | th_class TYPE string OPTIONAL 14 | th_style TYPE string DEFAULT 'font-weight: bold; border: #999 1px solid; background: #eee;' 15 | td_class TYPE string OPTIONAL 16 | td_style TYPE string DEFAULT 'border: #999 1px solid;', 17 | 18 | convert 19 | IMPORTING tbl TYPE ANY TABLE 20 | RETURNING VALUE(ret) TYPE string. 21 | 22 | PROTECTED SECTION. 23 | TYPES: 24 | BEGIN OF t_table_description, 25 | name TYPE string, 26 | title TYPE string, 27 | description TYPE string, 28 | END OF t_table_description, 29 | t_table_description_t TYPE STANDARD TABLE OF t_table_description WITH KEY name. 30 | 31 | 32 | DATA: 33 | cellpadding TYPE i VALUE 0, 34 | cellspacing TYPE i VALUE 0, 35 | 36 | table_class TYPE string VALUE '', 37 | table_id TYPE string VALUE '', 38 | table_style TYPE string VALUE '', 39 | 40 | tr_class TYPE string VALUE '', 41 | tr_style TYPE string VALUE '', 42 | 43 | th_class TYPE string VALUE '', 44 | th_style TYPE string VALUE '', 45 | 46 | td_class TYPE string VALUE '', 47 | td_style TYPE string VALUE ''. 48 | 49 | METHODS: 50 | get_description 51 | IMPORTING tbl TYPE ANY TABLE 52 | RETURNING VALUE(ret) TYPE t_table_description_t, 53 | 54 | title 55 | IMPORTING desc TYPE t_table_description_t 56 | RETURNING VALUE(ret) TYPE string, 57 | 58 | table_params 59 | RETURNING VALUE(ret) TYPE string, 60 | tr_params 61 | RETURNING VALUE(ret) TYPE string, 62 | th_params 63 | RETURNING VALUE(ret) TYPE string, 64 | td_params 65 | RETURNING VALUE(ret) TYPE string, 66 | 67 | value_to_string 68 | IMPORTING field TYPE string val TYPE any 69 | RETURNING VALUE(ret) TYPE string, 70 | 71 | footer 72 | IMPORTING desc TYPE t_table_description_t 73 | RETURNING VALUE(ret) TYPE string. 74 | ENDCLASS. 75 | 76 | 77 | 78 | CLASS zcl_itab_to_html IMPLEMENTATION. 79 | 80 | 81 | METHOD constructor. 82 | IF table_id IS SUPPLIED. 83 | me->table_id = table_id. 84 | ENDIF. 85 | IF table_class IS SUPPLIED. 86 | me->table_class = table_class. 87 | ENDIF. 88 | "IF table_style IS SUPPLIED. 89 | me->table_style = table_style. 90 | "ENDIF. 91 | 92 | IF tr_class IS SUPPLIED. 93 | me->tr_class = tr_class. 94 | ENDIF. 95 | IF tr_style IS SUPPLIED. 96 | me->tr_style = tr_style. 97 | ENDIF. 98 | 99 | IF th_class IS SUPPLIED. 100 | me->th_class = th_class. 101 | ENDIF. 102 | "IF th_style IS SUPPLIED. 103 | me->th_style = th_style. 104 | "ENDIF. 105 | 106 | IF td_class IS SUPPLIED. 107 | me->td_class = td_class. 108 | ENDIF. 109 | "IF td_style IS SUPPLIED. 110 | me->td_style = td_style. 111 | "ENDIF. 112 | ENDMETHOD. 113 | 114 | 115 | METHOD convert. 116 | DATA(descr) = get_description( tbl ). 117 | DATA(tr) = tr_params( ). 118 | DATA(td) = td_params( ). 119 | 120 | DATA row TYPE string VALUE ''. 121 | LOOP AT tbl ASSIGNING FIELD-SYMBOL(). 122 | CLEAR row. 123 | LOOP AT descr ASSIGNING FIELD-SYMBOL(). 124 | ASSIGN COMPONENT -name OF STRUCTURE TO FIELD-SYMBOL(). 125 | row = |{ row } { value_to_string( field = -name val = ) }|. 126 | ENDLOOP. 127 | 128 | ret = |{ ret } { row } |. 129 | ENDLOOP. 130 | 131 | 132 | ret = |{ title( descr ) }{ ret }{ footer( descr ) }|. 133 | ENDMETHOD. 134 | 135 | 136 | METHOD footer. 137 | ret = ||. 138 | ENDMETHOD. 139 | 140 | 141 | METHOD get_description. 142 | DATA(description) = CAST cl_abap_tabledescr( cl_abap_tabledescr=>describe_by_data( tbl ) ). 143 | DATA(components) = CAST cl_abap_structdescr( description->get_table_line_type( ) )->get_components( ). 144 | 145 | LOOP AT components ASSIGNING FIELD-SYMBOL(). 146 | DATA(elemdescr) = CAST cl_abap_elemdescr( -type )."->get_ddic_field( ). 147 | 148 | elemdescr->get_ddic_field( 149 | RECEIVING 150 | p_flddescr = DATA(elem) 151 | EXCEPTIONS 152 | not_found = 1 153 | no_ddic_type = 2 154 | OTHERS = 3 ). 155 | IF sy-subrc <> 0. 156 | APPEND VALUE #( name = -name title = -name description = -name ) TO ret. 157 | ELSE. 158 | APPEND VALUE #( name = -name title = elem-reptext description = elem-fieldtext ) TO ret. 159 | ENDIF. 160 | ENDLOOP. 161 | ENDMETHOD. 162 | 163 | 164 | METHOD table_params. 165 | IF table_id <> ''. 166 | ret = |{ ret } id="{ table_id }"|. 167 | ENDIF. 168 | 169 | IF table_class <> ''. 170 | ret = |{ ret } class="{ table_class }"|. 171 | ENDIF. 172 | 173 | IF table_style <> ''. 174 | ret = |{ ret } style="{ table_style }"|. 175 | ENDIF. 176 | ENDMETHOD. 177 | 178 | 179 | METHOD td_params. 180 | IF td_class <> ''. 181 | ret = |{ ret } class="{ td_class }"|. 182 | ENDIF. 183 | 184 | IF td_style <> ''. 185 | ret = |{ ret } style="{ td_style }"|. 186 | ENDIF. 187 | ENDMETHOD. 188 | 189 | 190 | METHOD th_params. 191 | IF th_class <> ''. 192 | ret = |{ ret } class="{ th_class }"|. 193 | ENDIF. 194 | 195 | IF th_style <> ''. 196 | ret = |{ ret } style="{ th_style }"|. 197 | ENDIF. 198 | ENDMETHOD. 199 | 200 | 201 | METHOD title. 202 | DATA(th) = th_params( ). 203 | 204 | LOOP AT desc ASSIGNING FIELD-SYMBOL(). 205 | ret = |{ ret } { -title }|. 206 | ENDLOOP. 207 | 208 | ret = | { ret } |. 209 | ENDMETHOD. 210 | 211 | 212 | METHOD tr_params. 213 | IF tr_class <> ''. 214 | ret = |{ ret } class="{ tr_class }"|. 215 | ENDIF. 216 | 217 | IF tr_style <> ''. 218 | ret = |{ ret } style="{ tr_style }"|. 219 | ENDIF. 220 | ENDMETHOD. 221 | 222 | 223 | METHOD value_to_string. 224 | ret = CONV string( val ). 225 | ENDMETHOD. 226 | ENDCLASS. 227 | -------------------------------------------------------------------------------- /src/zcl_itab_to_html.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_ITAB_TO_HTML 7 | E 8 | Converts the internal table into HTML format 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_itab_to_xls.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Converts the internal table into excel_xml

2 | CLASS zcl_itab_to_xls DEFINITION 3 | PUBLIC 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | 8 | METHODS constructor. 9 | 10 | METHODS convert 11 | IMPORTING 12 | tbl TYPE ANY TABLE 13 | alv_disvariant TYPE disvariant OPTIONAL 14 | RETURNING 15 | VALUE(ret) TYPE xstring. 16 | PROTECTED SECTION. 17 | 18 | ENDCLASS. 19 | 20 | 21 | 22 | CLASS zcl_itab_to_xls IMPLEMENTATION. 23 | 24 | 25 | METHOD constructor. 26 | ENDMETHOD. 27 | 28 | 29 | METHOD convert. 30 | DATA : 31 | mt_data TYPE REF TO data, 32 | salv TYPE REF TO cl_salv_table. 33 | 34 | FIELD-SYMBOLS: 35 | TYPE STANDARD TABLE. 36 | 37 | GET REFERENCE OF tbl INTO mt_data. 38 | 39 | ASSIGN mt_data->* TO . 40 | TRY . 41 | cl_salv_table=>factory( 42 | EXPORTING 43 | list_display = abap_false 44 | IMPORTING 45 | r_salv_table = salv 46 | CHANGING 47 | t_table = ). 48 | CATCH cx_salv_msg. 49 | 50 | ENDTRY. 51 | 52 | IF alv_disvariant-variant IS NOT INITIAL. 53 | DATA: 54 | lr_layout TYPE REF TO cl_salv_layout. 55 | 56 | lr_layout = salv->get_layout( ). 57 | 58 | lr_layout->set_key( VALUE #( 59 | report = COND #( WHEN alv_disvariant-report IS INITIAL THEN sy-cprog 60 | ELSE alv_disvariant-report ) 61 | handle = alv_disvariant-handle ) ). 62 | 63 | lr_layout->set_initial_layout( alv_disvariant-variant ). 64 | 65 | ENDIF. 66 | 67 | ret = salv->to_xml( xml_type = if_salv_bs_xml=>c_type_excel_xml ). 68 | 69 | ENDMETHOD. 70 | ENDCLASS. 71 | -------------------------------------------------------------------------------- /src/zcl_itab_to_xls.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_ITAB_TO_XLS 7 | E 8 | Converts the internal table into excel_xml 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_spool_to_pdf.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Converts the Spool into PDF

2 | CLASS zcl_spool_to_pdf DEFINITION 3 | PUBLIC 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | 8 | METHODS constructor . 9 | METHODS convert 10 | IMPORTING spoolid TYPE rspoid 11 | RETURNING VALUE(pdf_file_xstring) TYPE xstring 12 | "pdf_file_size TYPE i 13 | RAISING zcx_email. 14 | 15 | PROTECTED SECTION. 16 | 17 | ENDCLASS. 18 | 19 | 20 | 21 | CLASS zcl_spool_to_pdf IMPLEMENTATION. 22 | 23 | 24 | METHOD constructor. 25 | ENDMETHOD. 26 | 27 | 28 | METHOD convert. 29 | DATA rq TYPE tsp01. 30 | DATA bin_size TYPE i. 31 | DATA dummy TYPE TABLE OF rspoattr. 32 | 33 | * ------------ get attributes of spool request --------------------- 34 | CALL FUNCTION 'RSPO_GET_ATTRIBUTES_SPOOLJOB' 35 | EXPORTING 36 | rqident = spoolid 37 | IMPORTING 38 | rq = rq 39 | TABLES 40 | attributes = dummy 41 | EXCEPTIONS 42 | no_such_job = 1 43 | OTHERS = 2. 44 | IF sy-subrc <> 0. 45 | zcx_email=>raise_t100( EXPORTING iv_msgid = 'PO' 46 | iv_msgno = 126 47 | iv_msgv1 = CONV #( spoolid ) ). 48 | ENDIF. 49 | 50 | * --- convert spool request into PDF, dependent on document type --- 51 | IF rq-rqdoctype = 'OTF' OR rq-rqdoctype = 'SMART'. 52 | CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF' 53 | EXPORTING 54 | src_spoolid = spoolid 55 | no_dialog = 'X' 56 | pdf_destination = 'X' 57 | no_background = 'X' 58 | IMPORTING 59 | "pdf_bytecount = pdf_file_size 60 | bin_file = pdf_file_xstring 61 | EXCEPTIONS 62 | err_no_otf_spooljob = 1 63 | err_no_spooljob = 2 64 | err_no_permission = 3 65 | err_conv_not_possible = 4 66 | err_bad_dstdevice = 5 67 | user_cancelled = 6 68 | err_spoolerror = 7 69 | err_temseerror = 8 70 | err_btcjob_open_failed = 9 71 | err_btcjob_submit_failed = 10 72 | err_btcjob_close_failed = 11 73 | OTHERS = 12. 74 | IF sy-subrc <> 0. 75 | zcx_email=>raise_t100( EXPORTING iv_msgid = 'PO' 76 | iv_msgno = 712 77 | iv_msgv1 = CONV #( sy-subrc ) 78 | iv_msgv2 = CONV #( 'CONVERT_OTFSPOOLJOB_2_PDF' ) ). 79 | ENDIF. 80 | ELSEIF rq-rqdoctype = 'LIST'. 81 | CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF' 82 | EXPORTING 83 | src_spoolid = spoolid 84 | no_dialog = 'X' 85 | pdf_destination = 'X' 86 | no_background = 'X' 87 | IMPORTING 88 | "pdf_bytecount = pdf_file_size 89 | bin_file = pdf_file_xstring 90 | EXCEPTIONS 91 | err_no_abap_spooljob = 1 92 | err_no_spooljob = 2 93 | err_no_permission = 3 94 | err_conv_not_possible = 4 95 | err_bad_destdevice = 5 96 | user_cancelled = 6 97 | err_spoolerror = 7 98 | err_temseerror = 8 99 | err_btcjob_open_failed = 9 100 | err_btcjob_submit_failed = 10 101 | err_btcjob_close_failed = 11 102 | OTHERS = 12. 103 | IF sy-subrc <> 0. 104 | zcx_email=>raise_t100( EXPORTING iv_msgid = 'PO' 105 | iv_msgno = 712 106 | iv_msgv1 = CONV #( sy-subrc ) 107 | iv_msgv2 = CONV #( 'CONVERT_OTFSPOOLJOB_2_PDF' ) ). 108 | ENDIF. 109 | ELSE. 110 | zcx_email=>raise_t100( EXPORTING iv_msgid = 'PO' 111 | iv_msgno = 789 112 | iv_msgv1 = CONV #( rq-rqdoctype ) ). 113 | 114 | ENDIF. 115 | 116 | ENDMETHOD. 117 | ENDCLASS. 118 | -------------------------------------------------------------------------------- /src/zcl_spool_to_pdf.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_SPOOL_TO_PDF 7 | E 8 | Converts the Spool into PDF 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | CONVERT 17 | PDF_FILE_XSTRING 18 | E 19 | PDF BIN FILE 20 | 21 | 22 | CONVERT 23 | SPOOLID 24 | E 25 | Spool request number 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/zcx_email.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcx_email DEFINITION 2 | PUBLIC 3 | INHERITING FROM cx_static_check 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES if_t100_message . 9 | 10 | DATA msgv1 TYPE symsgv READ-ONLY . 11 | DATA msgv2 TYPE symsgv READ-ONLY . 12 | DATA msgv3 TYPE symsgv READ-ONLY . 13 | DATA msgv4 TYPE symsgv READ-ONLY . 14 | DATA mv_longtext TYPE string READ-ONLY . 15 | 16 | METHODS constructor 17 | IMPORTING 18 | textid LIKE if_t100_message=>t100key OPTIONAL 19 | previous LIKE previous OPTIONAL 20 | msgv1 TYPE symsgv OPTIONAL 21 | msgv2 TYPE symsgv OPTIONAL 22 | msgv3 TYPE symsgv OPTIONAL 23 | msgv4 TYPE symsgv OPTIONAL 24 | longtext TYPE csequence OPTIONAL . 25 | CLASS-METHODS raise_t100 26 | IMPORTING 27 | VALUE(iv_msgid) TYPE symsgid DEFAULT sy-msgid 28 | VALUE(iv_msgno) TYPE symsgno DEFAULT sy-msgno 29 | VALUE(iv_msgv1) TYPE symsgv DEFAULT sy-msgv1 30 | VALUE(iv_msgv2) TYPE symsgv DEFAULT sy-msgv2 31 | VALUE(iv_msgv3) TYPE symsgv DEFAULT sy-msgv3 32 | VALUE(iv_msgv4) TYPE symsgv DEFAULT sy-msgv4 33 | ix_previous TYPE REF TO cx_root OPTIONAL 34 | iv_longtext TYPE csequence OPTIONAL 35 | RAISING 36 | zcx_email . 37 | PROTECTED SECTION. 38 | PRIVATE SECTION. 39 | ENDCLASS. 40 | 41 | 42 | 43 | CLASS zcx_email IMPLEMENTATION. 44 | 45 | 46 | METHOD constructor ##ADT_SUPPRESS_GENERATION. 47 | 48 | super->constructor( previous = previous ). 49 | 50 | me->msgv1 = msgv1. 51 | me->msgv2 = msgv2. 52 | me->msgv3 = msgv3. 53 | me->msgv4 = msgv4. 54 | mv_longtext = longtext. 55 | 56 | CLEAR me->textid. 57 | 58 | IF textid IS INITIAL. 59 | if_t100_message~t100key = if_t100_message=>default_textid. 60 | ELSE. 61 | if_t100_message~t100key = textid. 62 | ENDIF. 63 | 64 | ENDMETHOD. 65 | 66 | 67 | METHOD raise_t100. 68 | DATA: ls_t100_key TYPE scx_t100key. 69 | 70 | ls_t100_key-msgid = iv_msgid. 71 | ls_t100_key-msgno = iv_msgno. 72 | ls_t100_key-attr1 = 'MSGV1'. 73 | ls_t100_key-attr2 = 'MSGV2'. 74 | ls_t100_key-attr3 = 'MSGV3'. 75 | ls_t100_key-attr4 = 'MSGV4'. 76 | 77 | IF iv_msgid IS INITIAL. 78 | CLEAR ls_t100_key. 79 | ENDIF. 80 | 81 | RAISE EXCEPTION NEW zcx_email( textid = ls_t100_key 82 | msgv1 = iv_msgv1 83 | msgv2 = iv_msgv2 84 | msgv3 = iv_msgv3 85 | msgv4 = iv_msgv4 86 | previous = ix_previous 87 | longtext = iv_longtext ). 88 | ENDMETHOD. 89 | ENDCLASS. 90 | -------------------------------------------------------------------------------- /src/zcx_email.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCX_EMAIL 7 | E 8 | ZEmail general exceptions 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | CONSTRUCTOR 18 | E 19 | CONSTRUCTOR 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/zet_demo.smtg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |
7 | ZET_DEMO 8 | A 9 | X 10 |
11 | 12 | 13 | ZET_DEMO 14 | A 15 | E 16 | ||Flight details and air fare|| 17 | ||Flight details and air fare|| 18 | 19 | 20 | 21 | 22 | ZET_DEMO 23 | A 24 | E 25 | ||Flight details and air fare|| 26 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 27 | <html> 28 | <head> 29 | <meta name="generator" content="HTML Tidy for SAP R/3 (vers 25 March 2009), see www.w3.org"> 30 | <title></title> 31 | </head> 32 | <body style="background-color:gray"> 33 | <table align="center" border="0" cellpadding="5" cellspacing="5" width="750" bgcolor="white" style="font-family:Arial; font-weight: bolder; font-size: 15px; letter-spacing: 0.025em; color:black; padding-right:20px; padding-left:20px"> 34 | <tbody> 35 | <tr> 36 | <td> 37 | <p>Hello &amp;USER_FIRST_NAME&amp;!</p> 38 | </td> 39 | </tr> 40 | <tr> 41 | <td> 42 | <p>We would like to inform you about Flight details and air fare.</p> 43 | </td> 44 | </tr> 45 | <tr> <td> 46 | &SFLIGHT_TAB& 47 | </td> </tr> 48 | <tr> 49 | <td> 50 | <p style="line-height:0.2">Thank you.</p> 51 | <p style="line-height:0.2">TATA Air.</p> 52 | </td> 53 | </tr> 54 | </tbody> 55 | </table> 56 | <br> 57 | </body> 58 | </html> 59 | 60 | 61 | 62 | ZET_DEMO 63 | A 64 | W 65 | ||Flight details and air fare|| 66 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 67 | <html> 68 | <head> 69 | <meta name="generator" content="HTML Tidy for SAP R/3 (vers 25 March 2009), see www.w3.org"> 70 | <title></title> 71 | </head> 72 | <body style="background-color:gray"> 73 | <table align="center" border="0" cellpadding="5" cellspacing="5" width="750" bgcolor="white" style="font-family:Arial; font-weight: bolder; font-size: 15px; letter-spacing: 0.025em; color:black; padding-right:20px; padding-left:20px"> 74 | <tbody> 75 | <tr> 76 | <td> 77 | <p>Hello &amp;USER_FIRST_NAME&amp;!</p> 78 | </td> 79 | </tr> 80 | <tr> 81 | <td> 82 | <p>We would like to inform you about Flight details and air fare.</p> 83 | </td> 84 | </tr> 85 | <tr> <td> 86 | &SFLIGHT_TAB& 87 | </td> </tr> 88 | <tr> 89 | <td> 90 | <p style="line-height:0.2">Thank you.</p> 91 | <p style="line-height:0.2">TATA Air.</p> 92 | </td> 93 | </tr> 94 | </tbody> 95 | </table> 96 | <br> 97 | </body> 98 | </html> 99 | 100 | 101 | 102 | ZET_DEMO 103 | A 104 | 105 | ||Flight details and air fare|| 106 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 107 | <html> 108 | <head> 109 | <meta name="generator" content="HTML Tidy for SAP R/3 (vers 25 March 2009), see www.w3.org"> 110 | <title></title> 111 | </head> 112 | <body style="background-color:gray"> 113 | <table align="center" border="0" cellpadding="5" cellspacing="5" width="750" bgcolor="white" style="font-family:Arial; font-weight: bolder; font-size: 15px; letter-spacing: 0.025em; color:black; padding-right:20px; padding-left:20px"> 114 | <tbody> 115 | <tr> 116 | <td> 117 | <p>Hello &amp;USER_FIRST_NAME&amp;!</p> 118 | </td> 119 | </tr> 120 | <tr> 121 | <td> 122 | <p>We would like to inform you about Flight details and air fare.</p> 123 | </td> 124 | </tr> 125 | <tr> <td> 126 | &SFLIGHT_TAB& 127 | </td> </tr> 128 | <tr> 129 | <td> 130 | <p style="line-height:0.2">Thank you.</p> 131 | <p style="line-height:0.2">TATA Air.</p> 132 | </td> 133 | </tr> 134 | </tbody> 135 | </table> 136 | <br> 137 | </body> 138 | </html> 139 | 140 | 141 | 142 | ZET_DEMO 143 | A 144 | 145 | ||Flight details and air fare|| 146 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 147 | <html> 148 | <head> 149 | <meta name="generator" content="HTML Tidy for SAP R/3 (vers 25 March 2009), see www.w3.org"> 150 | <title></title> 151 | </head> 152 | <body style="background-color:gray"> 153 | <table align="center" border="0" cellpadding="5" cellspacing="5" width="750" bgcolor="white" style="font-family:Arial; font-weight: bolder; font-size: 15px; letter-spacing: 0.025em; color:black; padding-right:20px; padding-left:20px"> 154 | <tbody> 155 | <tr> 156 | <td> 157 | <p>Hello &amp;USER_FIRST_NAME&amp;!</p> 158 | </td> 159 | </tr> 160 | <tr> 161 | <td> 162 | <p>We would like to inform you about Flight details and air fare.</p> 163 | </td> 164 | </tr> 165 | <tr> <td> 166 | &SFLIGHT_TAB& 167 | </td> </tr> 168 | <tr> 169 | <td> 170 | <p style="line-height:0.2">Thank you.</p> 171 | <p style="line-height:0.2">TATA Air.</p> 172 | </td> 173 | </tr> 174 | </tbody> 175 | </table> 176 | <br> 177 | </body> 178 | </html> 179 | 180 | 181 | 182 | ZET_DEMO 183 | A 184 | Z 185 | ||Flight details and air fare|| 186 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 187 | <html> 188 | <head> 189 | <meta name="generator" content="HTML Tidy for SAP R/3 (vers 25 March 2009), see www.w3.org"> 190 | <title></title> 191 | </head> 192 | <body style="background-color:gray"> 193 | <table align="center" border="0" cellpadding="5" cellspacing="5" width="750" bgcolor="white" style="font-family:Arial; font-weight: bolder; font-size: 15px; letter-spacing: 0.025em; color:black; padding-right:20px; padding-left:20px"> 194 | <tbody> 195 | <tr> 196 | <td> 197 | <p>Hello &amp;USER_FIRST_NAME&amp;!</p> 198 | </td> 199 | </tr> 200 | <tr> 201 | <td> 202 | <p>We would like to inform you about Flight details and air fare.</p> 203 | </td> 204 | </tr> 205 | <tr> <td> 206 | &SFLIGHT_TAB& 207 | </td> </tr> 208 | <tr> 209 | <td> 210 | <p style="line-height:0.2">Thank you.</p> 211 | <p style="line-height:0.2">TATA Air.</p> 212 | </td> 213 | </tr> 214 | </tbody> 215 | </table> 216 | <br> 217 | </body> 218 | </html> 219 | 220 | 221 | 222 | ZET_DEMO 223 | A 224 | 7 225 | ||Flight details and air fare|| 226 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 227 | <html> 228 | <head> 229 | <meta name="generator" content="HTML Tidy for SAP R/3 (vers 25 March 2009), see www.w3.org"> 230 | <title></title> 231 | </head> 232 | <body style="background-color:gray"> 233 | <table align="center" border="0" cellpadding="5" cellspacing="5" width="750" bgcolor="white" style="font-family:Arial; font-weight: bolder; font-size: 15px; letter-spacing: 0.025em; color:black; padding-right:20px; padding-left:20px"> 234 | <tbody> 235 | <tr> 236 | <td> 237 | <p>Hello &amp;USER_FIRST_NAME&amp;!</p> 238 | </td> 239 | </tr> 240 | <tr> 241 | <td> 242 | <p>We would like to inform you about Flight details and air fare.</p> 243 | </td> 244 | </tr> 245 | <tr> <td> 246 | &SFLIGHT_TAB& 247 | </td> </tr> 248 | <tr> 249 | <td> 250 | <p style="line-height:0.2">Thank you.</p> 251 | <p style="line-height:0.2">TATA Air.</p> 252 | </td> 253 | </tr> 254 | </tbody> 255 | </table> 256 | <br> 257 | </body> 258 | </html> 259 | 260 | 261 | 262 | ZET_DEMO 263 | A 264 | a 265 | ||Flight details and air fare|| 266 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 267 | <html> 268 | <head> 269 | <meta name="generator" content="HTML Tidy for SAP R/3 (vers 25 March 2009), see www.w3.org"> 270 | <title></title> 271 | </head> 272 | <body style="background-color:gray"> 273 | <table align="center" border="0" cellpadding="5" cellspacing="5" width="750" bgcolor="white" style="font-family:Arial; font-weight: bolder; font-size: 15px; letter-spacing: 0.025em; color:black; padding-right:20px; padding-left:20px"> 274 | <tbody> 275 | <tr> 276 | <td> 277 | <p>Hello &amp;USER_FIRST_NAME&amp;!</p> 278 | </td> 279 | </tr> 280 | <tr> 281 | <td> 282 | <p>We would like to inform you about Flight details and air fare.</p> 283 | </td> 284 | </tr> 285 | <tr> <td> 286 | &SFLIGHT_TAB& 287 | </td> </tr> 288 | <tr> 289 | <td> 290 | <p style="line-height:0.2">Thank you.</p> 291 | <p style="line-height:0.2">TATA Air.</p> 292 | </td> 293 | </tr> 294 | </tbody> 295 | </table> 296 | <br> 297 | </body> 298 | </html> 299 | 300 | 301 | 302 |
303 |
304 |
305 |
306 | --------------------------------------------------------------------------------